Flask web模板六–Flask-Login完成登录验证

在登录视图函数中通过表单提交的数据和数据库中的数据进行对比完成登录验证后可以通过Flask-Login插件实现将登录的信息写入cookie,然后对要求登录的页面进行验证,只有验证通过才能访问指定的页面。

1、安装插件并初始化
pip install Flask-Login
在app/__init__.py中导入插件并初始化

 -*- coding:utf-8 -*-
# 初始化flask核心对象

from flask import Flask
from app.models.base import db
from app.models.user import User
from flask_login import LoginManager


# 实例化flask登录插件
login_manager = LoginManager()


# 定义一个函数用来创建app核心对象
def create_app():
    app = Flask(__name__)
    # app.config.from_object('config')
    app.config.from_object('app.secure')
    app.config.from_object('app.setting')
    # 调用注册蓝图
    register_blueprint(app)
    # 初始化登录插件
    login_manager.init_app(app)
    # 告诉login插件认证失败是跳转的页面,将登陆页面的视图函数的endpoint告诉login插件
    login_manager.login_view = 'web.login'
    # 跳转后提示信息的定义
    login_manager.login_message = '请先登录或注册'
    # 初始化数据库
    db.init_app(app)
    with app.app_context():
        # 调用生成mysql表的函数
        db.create_all()
    return app


#  创建注册蓝图的方法
def register_blueprint(app):
    # 导入蓝图对象
    from app.web.blueprint import web
    app.register_blueprint(web)

2、修改登录视图函数login 编辑 app/web/account.py, 当用户验证完账号密码后浏览器中会有一个cookie

from flask_login import login_user

# 登录视图函数
@web.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if request.method == 'POST' and form.validate():
        user = User.query.filter_by(email=form.email.data).first()
        if user and user.check_password(form.password.data):
            # 将用户信息写入cookie, remember 表示cookie是否长时间生效
            # cookie有效时间需要设置flask配置参数 REMEMBER_COOKIE_DURATION
            login_user(user, remember=True)
            # 获得要跳转的页面,获得url中的next后面的值这个值就是要求登录的页面
            next = request.args.get('next')
            # 如果用户访问的登录页面后没有地址或者为非法地址都跳转到首页
            if not next or not next.startswith('/'):
                next = url_for('web.personal')
            return redirect(next)
        else:
            flash('账号不存在或者密码错误')
    return render_template('login.html', form=form)

3、在app/models/user.py模块中添加一个方法,这是一个独立的方法

# 这个函数是独立的模块函数,不是User模型的方法
# 加上装饰器是让login_manager这个插件加载这个函数,在其他视图函数中可以调用这个函数
@login_manager.user_loader
def get_user(uid):
    # 通过用户的id 来查询用户的模型,uid是主键查询可以不用filer_by可用get
    return User.query.get(int(uid))

4、创建一个视图函数文件app/web/user.py 保存用户信息的视图函数,内容如下

# -*- coding:utf-8 -*-
# 视图函数定义文件,定义和用户相关的视图函数

from .blueprint import web
from flask import session, redirect, render_template
from flask import current_app
from app.models.user import User
from flask_login import login_required, current_user, logout_user


# 登录后个人中心视图函数
@web.route('/personal/')
@login_required
def personal():
    user = User.query.get_or_404(current_user.id)
    user = current_user.summary
    return render_template('personal.html', user=user)


@web.route('/logout/')
def logout():
    logout_user()
    # return redirect('web.login')
    return render_template('index.html')
 

@web.route('/personal_edit')
@login_required
def personal_edit():
    pass

5、创建用户中心模板文件,在app/templates/下创建personal.html内容如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人中心</title>
</head>
<body>
    <h1>个人中心</h1>
    <table>
        <tr>
            <td>昵称</td>
            <td>邮箱</td>
            <td>电话</td>
        </tr>
        <tr>
            <td>{{ user.nickname }}</td>
            <td>{{ user.email }}</td>
            <td>{{ user.phone_number }}</td>
        </tr>
    </table>
    <a href="{{ url_for('web.personal_edit') }}">修改</a>
</body>
</html>

发表评论