Flask Web 开发 用户认证_2

来源:互联网 发布:阿里云青岛服务器地址 编辑:程序博客网 时间:2024/05/19 00:56

下面讲到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 LoginManagerlogin_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_requireddef 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 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')




下面的代码则是将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>


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








0 0