频道栏目
首页 > 网络 > 其他 > 正文

那些年我们学Flask-login,踩过史上最大的坑

2016-10-19 09:14:24           
收藏   我要投稿

Flask-Loging 可以方便的管理用户会话,保护路由只让认证用户访问

http://flask-login.readthedocs.org/en/latest/

注意:我这里使用的是models使用的是sqlachemy,和flask-sqlachemy的查询语法还有稍微有些区别

一.初始化Flask-Login
fromflask.ext.loginimportloginManager

loginManager=LoginManager(app)
#如果需要延迟创建app可使用
#loginManager=LoginManager()
#loginManager.init_app(app)

loginManager.session_protection="strong"
#可以设置None,'basic','strong'以提供不同的安全等级,一般设置strong,如果发现异常会登出用户

loginManager.login_view="login"
#这里填写你的登陆界面的路由

 

二.配置及使用Flask-Login

(1)使用flask-login有如下两种方法

在用户模型中实现 is_authenticated()方法 返回用户是否登陆is_active()方法 返回是否允许该用户登陆,返回false该用户将不能登陆is_anonymous()方法 返回是否是匿名用户, 也就是未登陆的用户等get_id() 返回可以唯一标识用户的Unicode字符串

 

注意:这个是在UserMinx里面

 

 

直接让用户模型继承 flask.ext.login.UserMixin类,类中有上面4个方法的默认实现 如:

flask-sqlachemy和sqlchemy这里都一样:

fromflask.ext.loginimportUserMixinclassUser(db.Model,UserMixin):
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(64),unique=True)

 

  1. Flask-Login还提供了 flask.ext.login.AnonymousUserMixin类 继承至该类的用户模型 将作为未登陆时的用户模型,可以保持代码的一致性

    (2)Flask-Login要求实现一个回调函数,使用 get_id()方法返回的唯一标识用户的Unicode字符串 作为参数 返回这个用户对象.

    如果是继承的UserMixin类, get_id()方法默认返回的用户的id. 如果用户不存在,应该返回None.

    此外如果需要定制数据库的nid时,可在上方添加:

    defget_id(self):
    returnself.nid

     

    默认情况下是查看id的:如果数据库的user表的主键为id,则可不定制get_id()

    flask-sqlachemy的语法如下:

    from.importloginManager
    
    @loginManager.user_loaderdefload_user(user_id):
    returnUser.query.get(int(user_id))

    sqlachemy语法如下:

    from.importloginManager
    
    #conn为连接数据库返回的session()
    @loginManager.user_loaderdefload_user(user_id):
    returnconn.query(Users).filter_by(id=id).first()

     

    (3)如果需要让页面只可又认证用户访问,可使用login_required装饰路由函数,未登陆的请求将会跳转到上面loginManager.login_view设置的登陆页面路由 如:

    fromflask.ext.loginimportlogin_required
    
    @app.route('/index')
    @login_requireddefindex():
    return"只有登陆用户能看到我"

     

    (4)登陆登出用户 使用如下代码:

     

    fromflask.ext.loginimportlogin_user,logout_user
    
    #获取要登陆的用户对象
    user=User.query.filter_by(user_name=username).first()
    #sqlachemy的查询语法
    #user=conn.query(Users).filter_by(user_name=username,password=password).first()
    
    #第一个参数传入用户对象,第二个参数传入以后是否自动登陆
    login_user(user,True)
    #登出logout_user()

    注意:如上查询的是flask-sqlachemy的语法,与sqlachemy查询语句略微不同

    (5)获取当前登陆的用户,

    fromflask.ext.loginimportcurrent_user
    #判断当前用户是否是匿名用户
    current_user.is_anonymous()

      也可以在模版中使用 {% if current_user.is_authenticated %} 判断

    (6)在模版中使用,如果用户已认证就显示他的名字

    {%ifcurrent_user.is_authenticated%}
    Hi{{current_user.name}}!
    {%endif%}
    相关TAG标签 Flask-Login
    上一篇:LAMP相关知识学习之LAMP源码编译安装详解
    下一篇:zabbix自定义脚本实现短信报警提醒
    相关文章
    图文推荐

    关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

    版权所有: 红黑联盟--致力于做实用的IT技术学习网站