Flask是什么?
Flask是一个Python编写的web框架,可以使用Python语言实现一个网站或者web服务,核心依赖是2个外部库: Jinja2 模板引擎和 WSGI工具集(Werkzeug),Flask的使用特点是具有各种扩展,Flask只保留了web开发的核心功能,扩展功能的添加,是以外部库的方式引用。
Flask性能满足一般web开发的需求, 并且灵活性以及可扩展性上要优于其他web框架, 对各种数据库的契合度都非常高,支持MSSQL,MySQL,Oracle等。
本文将展示如何编写一个登录站点,通过验证后,访问后端内容。
flask登录需要使用flask-login实现,flask-login通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user).
Flask-login 函数
- login_user() 函数:实现用户的登入,一般在登入的视图函数中调用;
- logout_user() 函数:实现登出功能;
- current_user 属性:获取当前用户;
- @login_required 装饰器,对于使用者来说,如果需要页面是授权用户才可见,在相应视图函数前加上 进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到LoginManager.login_view 所指定的视图.
定义User
登录基于用户,需要定义 User 类,Flask-Login 规定 User 类必须实现三个属性和一个方法:
is_authenticated 属性
is_active 属性
is_anonymous 属性
get_id() 方法
使用UserMixin
类,可以简化配置步骤.
建议采用外部数据库维护账户信息,避免账户数据风险,本次仅做演示!!!
from flask import Flask, request, flash, render_template, redirect
from flask_login import UserMixin
class User(UserMixin):
pass
users = [
{'id':'101', 'username': 'ciscoskys1', 'password': '111222'},
{'id':'102', 'username': 'ciscoskys2', 'password': '222444'}
]
#简化配置账户信息,写入代码,或者使用数据库动态查询账户信息
def query_user(user_id):
for user in users:
if user_id == user['id']:
return user
应用程序配置
from flask_login import LoginManager,login_required, logout_user, login_user, current_user
#创建loginmanager实例,绑定app
login_manager = LoginManager()
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Access denied. Please login.'
login_manager.init_app(app)
回调user函数
"""
user session 记录的是用户 ID (user_id),回调函数的作用就是通过 user_id 返回对应的 User 对象
user_loader 回调函数在 user_id 非法的时候不应该抛出异常,而要返回 None。没有这个回调函数的话,Flask-Login 无法正常运行
"""
@login_manager.user_loader
def load_user(user_id):
if query_user(user_id) is not None:
curr_user = User()
curr_user.id = user_id
return curr_user
Login功能 实现
"""
关键语句是 login_user(curr_user) ,之前要构建 User 对象,并指定 id
"""
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
user_id = request.form.get('userid')
user = query_user(user_id)
if user is not None and request.form['password'] == user['password']:
curr_user = User()
curr_user.id = user_id
# 通过Flask-Login的login_user方法登录用户
login_user(curr_user)
return redirect(url_for('index'))
else:
tm_login = time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime()) # 当前运行时间
flash('ERROR:\t' + 'Wrong username or password!' + '\t' + str(tm_login))
return render_template('login1.html', error=error)
# GET 请求
return render_template('login.html')
Logout功能实现
@app.route('/logout')
@login_required
def logout():
logout_user()
return 'Logged out successfully!'