47 views

在那几年里,我们学Flask-login,踩过了历史上最大的坑。

By | 2019年8月4日

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有如下两种方法

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

注意:这个是在UserMinx里面

直接让用户模型继承 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)

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)如果您只需要使页面可访问并对用户进行身份验证,则可以用登录名来修饰路由功能。未加载的请求将跳转到由LoginManager设置的登录页路由。上面的登录视图。 如:

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

本文编辑于2019年08月4日,属于云漫网络原创内容,由特约作者(云漫网络开发技术)首发在win-man.com,云漫网络每日更新发布行业原创内容,转载请注明出处。否则属侵权行为一定追究责任。

作者:云漫网络开发技术
本文转载于:http://win-man.com
本文关键词:TTWAF,TTCDN,高防CDN,高防服务器

发表评论

电子邮件地址不会被公开。 必填项已用*标注