flask_login

一、配置

对于登录系统,我们将会使用到两个扩展,Flask-Login 和 Flask-OpenID。在microblog.py中配置:

Flask-OpenID 扩展需要一个存储文件的临时文件夹的路径。对此,我们提供了一个 tmp 文件夹的路径。

二、重构用户模型

Flask-Login 扩展需要在我们的 User 类中实现一些特定的方法。但是类如何去实现这些方法却没有什么要求。

s_authenticated 方法有一个具有迷惑性的名称。一般而言,这个方法应该只返回 True,除非表示用户的对象因为某些原因不允许被认证。

is_active 方法应该返回 True,除非是用户是无效的,比如因为他们的账号是被禁止。

is_anonymous 方法应该返回 True,除非是伪造的用户不允许登录系统。

最后,get_id 方法应该返回一个用户唯一的标识符,以 unicode 格式。我们使用数据库生成的唯一的 id。需要注意地是在 Python 2 和 3 之间由于 unicode 处理的方式的不同我们提供了相应的方式。

三、user_loader回调

首先,我们必须编写一个函数用于从数据库加载用户。这个函数将会被 Flask-Login 使用(文件 microblog.py):

注:在 Flask-Login 中的用户 ids 永远是 unicode 字符串,因此在我们把 id 发送给 Flask-SQLAlchemy 之前,把 id 转成整型是必须的,否则会报错!

四、编写登录函数(microblog.py)

(1)这里我们在登录函数中添加了一个新的装饰器@oid.loginhandler告诉 Flask-OpenID 这是我们的登录函数。

(2)在函数开始的时候,我们检查 g.user 是否被设置成一个认证用户,如果是的话将会被重定向到首页。

(3)Flask 中的 g 全局变量是一个在请求生命周期中用来存储和共享数据。

(4)在 redirect 调用中使用的 url_for 函数是定义在 Flask 中,以一种干净的方式为一个给定的视图函数获取 URL。

(5)我们把 remember_me 布尔值存储到 flask 的会话中,flask.session 提供了一个更加复杂的服务对于存储和共享数据。一旦数据存储在会话对象中,在来自同一客户端的现在和任何以后的请求都是可用的。数据保持在会话中直到会话被明确地删除。

(6)oid.try_login 被调用是为了触发用户使用 Flask-OpenID 认证。该函数有两个参数,用户在 web 表单提供的 openid 以及我们从 OpenID 提供商得到的数据项列表。因为我们已经在用户模型类中定义了 nickname和 email,这也是我们将要从 OpenID 提供商索取的。

(7)OpenID 认证异步发生。如果认证成功的话,Flask-OpenID 将会调用一个注册了 oid.after_login 装饰器的函数。如果失败的话,用户将会回到登陆页面。

五、Flask-OpenID登录回调(microblog.py)

(1)resp 参数传入给 after_login 函数,它包含了从 OpenID 提供商返回来的信息。

(2)登录成功后,将登录账户的用户名和邮箱存到数据库的用户表里,最后重定向到首页

(3)接下来我们需要告诉Flask_Login哪个函数允许用户登录

六、全局变量g.user(microblog.py)

(1)任何使用了 before_request 装饰器的函数在接收请求之前都会运行。

(2)全局变量 current_user 是被 Flask-Login 设置的,因此我们只需要把它赋给 g.user ,让访问起来更方便。有了这个,所有请求将会访问到登录用户,即使在模版里。

七、首页视图(microblog.py)

这里我们做了两处改变

(1)添加了 login_required 装饰器。这确保了这页只被已经登录的用户看到。

 (2)我们把 g.user 传入给模版,代替之前使用的伪造对象。

八、登出

(1)在microblog.py文件中加入登出函数

(2)将登出连接放到base.html中

九、运行看实现效果 :python microblog.py

注:这里我注册了一个yahoo账号,登录的时候比较慢

成功之后返回到首页(index),并将登录账户存到数据库中

原文地址:https://www.cnblogs.com/ninicwang/p/6004571.html