您现在的位置是:首页 > 文章详情

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

日期:2016-10-16点击:395

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


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

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

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

一.初始化Flask-Login

from flask.ext.login import loginManager 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有如下两种方法

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


    注意:这个是在UserMinx里面



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

    flask-sqlachemy和sqlchemy这里都一样:

from flask.ext.login import UserMixinclass User(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时,可在上方添加:

def get_id(self):     return self.nid


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

flask-sqlachemy的语法如下:

from . import loginManager @loginManager.user_loaderdef load_user(user_id):         return User.query.get(int(user_id))

sqlachemy语法如下:

from . import loginManager #conn为连接数据库返回的session() @loginManager.user_loaderdef load_user(user_id):         return conn.query(Users).filter_by(id = id).first()


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

from flask.ext.login import login_required @app.route('/index') @login_requireddef index():         return "只有登陆用户能看到我"


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


from flask.ext.login import login_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)获取当前登陆的用户,

from flask.ext.login import current_user #判断当前用户是否是匿名用户 current_user.is_anonymous()

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

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

{% if current_user.is_authenticated %}  Hi {{ current_user.name }}! {% endif %}


这里注意:is_authenticated()加上()会报错,current_user.name的name是users表的nam
e

原文链接:https://blog.51cto.com/wengmengkai/1862493
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章