flask web开发-用户认证代码分析(三)
来源:互联网 发布:pdf阅读器有没有mac 编辑:程序博客网 时间:2024/05/25 05:34
其实我写这个代码分析,主要的目的就是梳理一下,各个代码块之间是如何联系的,如何联动,如何工作,最终形成几个跳转的页面.
上一篇博文里说了密码加密,登录密码验证的代码,这篇博文我分享一下登陆模型,登录表单,登录路由保护,登出等代码块,最后会给出登录认证代码的清晰的思路,有错误的地方,欢迎指正.
FLASK-Login这个扩展能很好的提供登录模型,先安装扩展.由于我是在ubuntu中建的虚拟环境(venv),所以代码前是虚拟环境的标识.多说一句,你的flask是python2的环境,那么用pip安装就好了,我习惯了python3.
(venv) $ pip3 install flask-login
接下来写user模型app/models.py,之前博文中产生密码散列值的模型也在这个文件中编写.UserMixin是flask_login扩展中一个类能实现扩展的调用使用.
from flask_login import UserMixinclass User(UserMixin, db.Model): __tablename__ = 'users' #指定为'user' id = db.Column(db.Integer, primary_key = True)#把表中的id作为主键值,整型数据 email = db.Column(db.String(64), unique=True, index=True) username = db.Column(db.String(64), unique=True, index=True)#把email,username作为键值,并不允许重复,类型均为string password_hash = db.Column(db.String(128))#把密码的散列值作为键值,以便验证密码时访问. role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))#把表role中的id列添加到users表的被称为外键的role_id的列中,建立了两个表的联系.
接下来初始化flask-login,app/_init_.py
from flask_login import LoginManagerlogin_manager = LoginManager()#启动程序对象login_manager.session_protection = 'strong'#把会话安全等级设为最高,这样flask-login就会记录客户端IP的地址和浏览器的代理地址,检测到异常就会自动退出登录.login_manager.login_view = 'auth.login'#把登录页面作为启动的路由def create_app(config_name): # ... login_manager.init_app(app) #配置信息
flask-login要求程序实现一个回调函数,返回接收到的unicode形式的用户对象如果没有找到就返回none,程序如下.一般放在程序的末尾,app/models.py
@login_manager.user_loaderdef load_user(user_id): return User.query.get(int(user_id))#用户查询函数来接收用户标识符id
还要做的一件事是保护路由,确保当未认证的用户访问登录路由时,会被拦截.其实在程序中判断用户认证时已经将未认证的用户的请求拦截,并发送到了登录界面,可以看上一篇博文中,验证用户时的设置.下面是可以实现该功能的代码,并不是整个工程程序块中的代码
from flask_login import login_required@app.route('/secret')@login_requireddef secret(): return 'Only authenticated users are allowed!'
前面就是一些重要的支线任务了,现在看主线任务,添加登录表单.
添加登录表单包含email,password,remember_me,submit等字段,并给出了对应的类型以及格式,required函数给出类型要求,password类型的数据那么输入时是不可见的,email类型的数据输入时必须满足邮件格式.
from flask.ext.wtf import Formfrom wtforms import StringField, PasswordField, BooleanField, SubmitFieldfrom wtforms.validators import Required, Length, Emailclass LoginForm(Form): email = StringField('Email', validators=[Required(), Length(1, 64),Email()]) password = PasswordField('Password', validators=[Required()]) remember_me = BooleanField('Keep me logged in') submit = SubmitField('Log In')
表单写完后,需要模板渲染后显示为页面,用在博文一中提到的wtf.quick_form()来渲染,这个宏在login.html文件中 {{ wtf.quick_form(form) }}.然后登录时用户验证部分上一篇博文中有说到.
- flask web开发-用户认证代码分析(三)
- flask-web开发-用户认证代码分析(四)
- Flask Web开发-用户认证部分代码分析(一)
- flask web开发-用户认证部分代码分析(二)
- flask web开发-用户验证代码分析(五)
- Flask Web 开发 用户认证
- Flask Web 开发 用户认证_2
- Flask Web 开发 用户认证_3
- Flask Web 开发 用户认证_4
- Flask Web 开发 用户认证_5
- Flask Web 开发 用户认证_6
- 《flask web开发》第八章 用户认证
- flask-用户认证(上)
- flask-用户认证(下)
- Flask Web 开发学习稿(三)
- [python3.6 flask web学习]Flask用户认证框架
- Flask Web 开发 用户角色
- Flask Web 开发 用户资料
- Swift协议合成
- Okhttp工具类
- Java:计算圆形和长方形的面积
- 线程的五大状态
- 10月25日 c语言 找到10000以内所有完数
- flask web开发-用户认证代码分析(三)
- Apache服务器的下载与安装
- Swift委托代理实现
- FastCgi与PHP-fpm之间是个什么样的关系
- jq 自定义动画animate
- 用单个控件进行轮播
- Java面试题全集(中)
- 纪念我的zadas bug之一
- angular实现商品购物