博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8.3 为我们的web程序添加登录功能——flask-login
阅读量:4096 次
发布时间:2019-05-25

本文共 3862 字,大约阅读时间需要 12 分钟。

一. 安装flask-login扩展

&pip install flask-login

安装完新的扩展以后不要忘记更新requirements.txt文件:

&pip freeze >requirements.txt

二. 初始化扩展——|-app/__init__.py:

from flask_login import LoginManagerlogin_manager = LoginManager()  #创建实例login_manager.session_protection = 'strong'  #该参数有三个选项:None,'basic', 'strong', 保护用户会话不被窃取login_manager.login_view = 'auth.login'  #记录登录视图def create_app(config_name):    #...    login_manager.init_app(app)  #初始化    return app

三. 修改|-app/models.py

  flask_login要求实现下面四个用户方法;flask-login还要求程序实现一个回调函数, 根据用户id加载用户。

方法 说明           
is_authenticated 如果用户已经登录, 返回True
is_active 如果允许用户登录, 必须返回True;如果禁用账户,可以返回False
is_anonymous 对普通用户必须返回False
get_id() 必须返回用户的唯一标志符

我们可以自己在User类中实现这四个方法, 还有一更简便的做法是, 让User类继承UserMixin, 因为UserMixin已经实现了这四个方法:

from flask import UserMixinfrom . import db, login_managerclass User(UserMixin, db.Model):    id = db.Column(db.Integer, primary_key=True)    username = db.Column(db.String(64), unique=True, index=True)    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))    password_hash = db.Column(db.String(128))    email = db.Column(db.String(64), unique=True, index=True)  #为了便于登录, 我们增加了email字段, 对用户来说email地址比用户名更容易记住。#flask-login要求程序实现一个回调函数, 根据用户id加载用户:@login_manager.user_loaderdef load_user(user_id):    return User.query.get(int(user_id))

四. 修改|-app/auth/forms.py

该脚本定义登录表单:

from flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, BooleanField, SubmitFieldfrom wtforms.validators import Length, Email, DataRequiredclass LoginForm(FlaskForm):    email = StringField('email', validators=[ Length(1, 64), Email() ])    password = PasswordField('password', validators=[ DataRequired() ])    remember_me = BooleanField('keep me log in')    submit = SubmitField('log_in')

五. 修改|-app/-auth/-views.py

from . import authfrom .forms import LoginFormfrom ..models import Userfrom flask_login import login_user, login_required, logout_userfrom flask import redirect, request, url_for, flash, render_template@auth.route('/login', methods=['GET', 'POST'])def login():    form = LoginForm()    if form.validate_on_submit():  #表单数据通过字段的验证函数        user = User.query.filter_by(email=form.email.data).first()  #从数据库中查询有无该email的用户        if user and user.verify_password(form.password.data):  #用户存在且密码正确            login_user(user, form.remember_me.data)  #登录用户, 第二个参数是记住登录状态            #重定向, or前面的值是上个浏览页面(ps:登录页面)的url, 如果用户访问未授权的url就会重定向到登录页面, 否  #则返回主页。            return redirect(request.args.get('next') or url_for('main.index'))         flash('Invalid email or password!')  #如果用户不存在或者密码不正确刷新flash消息    return render_template('auth/login.html', form=form)@auth.route('/logout')@login_required  #未授权用户访问该路由时会返回登录页面def logout():    logout_user()  #登出用户    flash('You have been logged out')    return redirect(url_for('main.index'))

六. 修改|-app/-templates

1.base.html  #在导航条增加一login和logout链接

    current_user是flask-login提供的, 可以直接在视图函数和模板中使用, 如果当前用户已登录就显示Log Out, 否则显示Log In。

2. index.html

{% extends 'base.html' %}{% import 'bootstrap/wtf.html' as wtf %}{% block title %}Flasky{% endblock %}{% block page_content %}
{
{ wtf.quick_form(form) }}{% endblock %}

3.auth/login.html

{% extends 'base.html' %}{% import 'bootstrap/wtf.html' as wtf %}{% block title %}Flasky - Login{% endblock %}{% block page_content %}
{
{ wtf.quick_form(form) }}
{% endblock %}

七. 效果演示

1. 创建一个用户, 以备测试:

&python manage.py shell

>u = User(email='1546879589@qq.com', username='john', password='cat')

>db.session.add(u)

>db.session.commit()

2. 启动服务器

3.用浏览器访问根地址:

4.点击右上角的Sign In链接访问登录页面:

5. 输入邮件和密码后点击提交按钮:

6.点击右上角的Sign Out链接, 退出登录

你可能感兴趣的文章
处理Maven本地仓库.lastUpdated文件
查看>>
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
线性数据结构学习笔记
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ32:把数组排成最小的数
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>