用户登录组件Flask-Login
文档:
简要说明
flask_login提供的方法
# 类 UserMixin 用户类 #方法 login_user() 用户登入 logout_user() 登出功能 # 变量 current_user 获取当前用户 # 装饰器 @login_required 访问限制
基本的接口
# 1、实例化登录管理对象login_manager = LoginManager(app)# 2、编写用户类class User(UserMixin): pass# 3、加载用户, login_required 需要查询用户信息@login_manager.user_loaderdef user_loader(user_id: str): """ [注意] 这里的user_id类型是str """ return User()# 4、登录@app.route('/login', methods=['GET', 'POST'])def login(): login_user(User())# 5、登出功能实现@app.route('/logout')@login_requireddef logout(): logout_user(User())# 6、访问控制@app.route('/')@login_requireddef index(): pass
使用示例
app.py
from flask import Flask, request, flash, render_template, redirect, url_forfrom flask_login import UserMixin, LoginManager, login_required, logout_user, login_user, current_user# 创建 Flask 应用app = Flask(__name__)app.secret_key = 'secret_key' # 设置表单交互密钥# 模拟数据库查询class UserService: users = [ {'id': 1, 'username': 'tom', 'password': '1'}, {'id': 2, 'username': 'jack', 'password': '2'} ] @classmethod def query_user_by_name(cls, username): for user in cls.users: if username == user['username']: return user @classmethod def query_user_by_id(cls, user_id): for user in cls.users: if user_id == user['id']: return user# 1、实例化登录管理对象login_manager = LoginManager()# 参数配置login_manager.login_view = 'login'login_manager.login_message_category = 'info'login_manager.login_message = 'Access denied.'login_manager.init_app(app) # 初始化应用# 2、编写用户类class User(UserMixin): pass# 3、加载用户, login_required 需要查询用户信息@login_manager.user_loaderdef user_loader(user_id: str): """ [注意] 这里的user_id类型是str :param user_id: :return: """ if UserService.query_user_by_id(int(user_id)) is not None: curr_user = User() curr_user.id = user_id return curr_user# 4、登录@app.route('/login', methods=['GET', 'POST'])def login(): if request.method == 'POST': username = request.form.get('username') user = UserService.query_user_by_name(username) 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) # 登录成功后重定向 next_url = request.args.get('next') return redirect(next_url or url_for('index')) flash('Wrong username or password!') else: # GET 请求 return render_template('login.html')# 5、登出功能实现@app.route('/logout')@login_requireddef logout(): # 通过Flask-Login的logout_user方法登出用户 logout_user() return 'Logged out successfully!'# 6、访问控制@app.route('/')@login_requireddef index(): return 'index: ' + current_user.get_id()if __name__ == '__main__': app.run(debug=True)
视图文件 templates/login.html
<!DOCTYPE html><title>Login</title><h1>Login</h1>{% with messages = get_flashed_messages() %} <div>{{ messages[0] }}</div>{% endwith %}<form action="{{ url_for('login') }}" method="POST"> <p><input type="text" name="username" id="username" placeholder="Username"/></p> <p><input type="password" name="password" id="password" placeholder="Password"/></p> <p><input type="submit" name="submit"/></p></form>