Flask-Login提供Flask的用户会话管理。它处理登录,注销和记住用户会话的常见任务。
它会:
1.将活动用户的ID存储在会话中,让您轻松登录和注销。
2.让您将视图限制为已登录(或已注销)用户。
3.处理通常令人毛骨悚然的“记住我”功能。
4.帮助保护您的用户会话免遭Cookie小偷窃取。
5.稍后可能与Flask-Principal或其他授权扩展集成。
但是,它不会:
1.对您强加特定的数据库或其他存储方法。您完全负责用户的加载方式。
2.限制您使用用户名和密码,OpenID或任何其他身份验证方法。
3.处理超出“是否登录”权限的权限。
4.处理用户注册或帐户恢复。
-安装flask-login
$ pip install flask-login
- 完整的项目结构
环境变量
- 安装 python-dotenv,避免了每次运行代码都要定义环境变量
pip install python-dotenv
- 根目录新建.flaskenv环境变量文件
FLASK_APP=microblog.py
- microblog.py
from app import app, db #从初始化模块中导入
from app.models import User, Post
@app.shell_context_processor
def make_shell_context():
return {
'db': db, 'User': User, 'Post': Post}
- 数据库配置项
config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
app.db 项目运行后产生
- 初始化模块 init.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config
from flask_login import LoginManager
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app) #向数据库中增加数据
migrate = Migrate(app, db) #数据库迁移功能
login = LoginManager(app) #用来保存用于记录的位置
login.login_view = 'login'
from app import routes, models
- 用户加载模块
1.定义用户数据库模型
2.加载数据库匹配用户
用户类别:
如果继承UserMixin类,则默认实现了上述方法;
- app/models.py
from datetime import datetime
from app import db, login
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
class User(UserMixin,db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
posts = db.relationship('Post', backref='author', lazy='dynamic')
def __repr__(self):
return '<User {}>'.format(self.username)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
@login.user_loader
def load_user(id):
return User.query.get(int(id))
class Post(db.Model):
id = db.Column(db.Integer, primary_key