您的位置:首页 > 其它

Flask Web 开发 用户认证_2

2016-08-21 20:33 351 查看
下面讲到Flask-Login 这个扩展

要用到这个扩展,就要在模型文件里面添加一些内容了



app/models.py:修改User 模型,支持用户登录
class User(UserMixin,db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
email=db.Column(db.String(64),unique=True,index=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 字段。在这个程序中,用户使用电子邮件地址登录,因为相对于用户名而言,用户更不容易忘记自己的电子邮件地址。

Flask-Login 在程序的工厂函数中初始化,如示例8-7 所示。app/__init__.py:初始化Flask-Login

from flask.ext.login import LoginManager
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'auth.login'
def create_app(config_name):
# ...
login_manager.init_app(app)
# ...


LoginManager 对象的session_protection 属性可以设为None、'basic'或'strong',以提供不同的安全等级防止用户会话遭篡改。设为'strong' 时,Flask-Login 会记录客户端IP

地址和浏览器的用户代理信息,如果发现异动就登出用户。login_view 属性设置登录页面的端点。回忆一下,登录路由在蓝本中定义,因此要在前面加上蓝本的名字。

接下来是保护路由的功能,看了以后一下子没理解是什么作用

为了保护路由只让认证用户访问,Flask-Login 提供了一个login_required 修饰器。用法演示如下:

from flask.ext.login import login_required
@auth.route('/logout')
@login_required
def logout():
logout_user()
flash('You have been logged out.')
return redirect(url_for('main.index'))



如果未认证的用户访问这个路由,Flask-Login 会拦截请求,把用户发往登录页面。

先讲后面的吧,后面讲到的是定义表单

app/auth/forms.py:登录表单

from flask.ext.wtf import Form
from wtforms import StringField,PasswordField,BooleanField,SubmitField
from wtforms.validators import Required,Length,Email

class 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')





下面的代码则是将sign insign out添加进网页里面

app/templates/base.html:导航条中的Sign In 和Sign Out 链接

<ul class="nav navbar-nav navbar-right">

{% if current_user.is_authenticated %}                            #这里尤其要注意一下,authenticated后面,不需要再加括号了,flask-login新版本里都不需要,老版本要

<li><a href="{{ url_for('auth.logout') }}">Sign Out</a></li>

{% else %}

<li><a href="{{ url_for('auth.login') }}">Sign In</a></li>

{% endif %}

</ul>

这样,就能显示出登陆表单的页面了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: