pip install flask-login
flask-login使用需要有user对象。user对象必须实现下面的几个属性和方法。
| 属性/方法 | 说明 |
|---|---|
| is_authenticated | 如果用户提供的登陆凭据有效,返回True,否则False |
| is_active | 如果允许用户登陆,必须返回True,否则返回False |
| is_anonymous | 对普通用户必须返回False,如果是表示匿名登陆的特殊用户对象必须返回True |
| get_id() | 返回用户的唯一标识符,unicode编码字符串 |
更简单的替代方案:UserMixin类
from . import db
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
class User(UserMixin,db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(64), unique=True, info='邮箱')
username = db.Column(db.String(64), nullable=False, unique=True, info='账户')
password_hash = db.Column(db.String(128))
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __init__(self, username=None, password=None, status='active'):
self.username = username
self.password = password
self.status = status
def __repr__(self):
return '' % self.username
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
flask-login在应用工厂中初始化:
from flask_login import LoginManager login_manager = LoginManager() login_manager.login_view = 'auth.login' # 跳转endpoint def create_app(config): .... login_manager.init_app(app) ....
flask-login还要求指定一个函数,在插件需要从数据库中获得指定标识符对应的用户时使用。
@login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
装饰器把函数注册给flask-login,在这个扩展需要用户信息时调用。传给sqlalchemy查询,加载用户。
可以基于flask_login来保护路由:
frim flask_login import login_required
@app.route('/secret')
@login_required
def secret():
return 'only anthenticated users are allowed!'
Reference
- 《Flask Web开发:基于Python的Web应用开发实战》



