用户登录组件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_loader
def 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_required
def logout():
logout_user(User())
# 6、访问控制
@app.route('/')
@login_required
def index():
pass
使用示例
app.py
from flask import Flask, request, flash, render_template, redirect, url_for
from 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_loader
def 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_required
def logout():
# 通过Flask-Login的logout_user方法登出用户
logout_user()
return 'Logged out successfully!'
# 6、访问控制
@app.route('/')
@login_required
def 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>