title = 'Sign In',
form = form,
providers = app.config['OPENID_PROVIDERS'])
注意到我们导入了一些新的模块,其中有些后面会用到 。
跟上个版本的变化很小 。我们给视图函数添加了一个新的装饰器:oid.loginhandler 。它告诉Flask-OpenID这是我们的登录视图函数 。
在方法体的开头 , 我们检测是是否用户是已经经过登录认证的,如果是就重定向到index页面 。这儿的思路是如果一个用户已经登录了,那么我们不会让它做二次登录 。
全局变量g是Flask设置的,在一个request生命周期中,用来存储和共享数据的变量 。所以我猜你已经想到了,我们将把已经登录的用户放到g变量里 。
我们在调用redirect()时使用的url_for()方法是Flask定义的从给定的view方法获取url 。如果你想重定向到index页面,你h很可能使用redirect('/index'),但是我们有很好的理由让Flask为你构造url 。
当我们从登录表单得到返回数据,接下来要运行的代码也是新写的 。这儿我们做两件事 。首先我们保存remember_me的布尔值到Flask的session中,别和Flask-SQLAlchemy的db.session混淆了 。我们已经知道在一个request的生命周期中用Flask的g对象来保存和共享数据 。沿着这条线路Flask的session提供了更多 , 更复杂的服务 。一旦数据被保存到session中,它将在同一客户端发起的这次请求和这次以后的请求中永存而不会消亡 。数据将保持在session中直到被明确的移除 。为了做到这些,Flask为每个客户端建立各自的session 。
下面的oid.try_login是通过Flask-OpenID来执行用户认证 。这个方法有两个参数,web表单提供的openid和OpenID provider提供的我们想要的list数据项 。由于我们定义了包含nickname和email的User类,所以我们要从找nickname和email这些项 。
基于OpenID的认证是异步的 。如果认证成功,Flask-OpenID将调用有由oid.after_login装饰器注册的方法 。如果认证失败那么用户会被重定向到login页面 。
Flask-OpenID登录回调
这是我们实现的after_login方法(app/views.py)
@oid.after_login
def after_login(resp):
if resp.email is None or resp.email == "":
flash('Invalid login. Please try again.')
redirect(url_for('login'))
user = User.query.filter_by(email = resp.email).first()
if user is None:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
user = User(nickname = nickname, email = resp.email, role = ROLE_USER)
db.session.add(user)
db.session.commit()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
session.pop('remember_me', None)
login_user(user, remember = remember_me)
return redirect(request.args.get('next') or url_for('index'))
传给after_login方法的resp参数包含了OpenID provider返回的一些信息 。
第一个if声明仅仅是为了验证 。我们要求一个有效的email,所以一个没有没提供的email我们是没法让他登录的 。
接下来,我们将根据email查找数据库 。如果email没有被找到我们就认为这是一个新的用户,所以我们将在数据库中增加一个新用户,做法就像我们从之前章节学到的一样 。注意我们没有处理nickname,因为一些OpenID provider并没有包含这个信息 。
做完这些我们将从Flask session中获取remember_me的值,如果它存在,那它是我们之前在login view方法中保存到session中的boolean类型的值 。
然后我们调用Flask-Login的login_user方法,来注册这个有效的登录 。
最后,在最后一行我们重定向到下一个页面,或者如果在request请求中没有提供下个页面时 , 我们将重定向到index页面 。
推荐阅读
- jsp中java代码块,jsp java代码
- iosgba4ios怎么下游戏下载游戏,苹果4s怎么下载b站
- 精灵射击的街机游戏名字,精灵射击的街机游戏名字叫什么
- 快手李北音直播回放,李北音资料
- 关于vb.net号意思的信息
- 如何用命令连接sqlserver数据库,如何在命令窗口连接mysql数据库?
- 腾讯篮球直播视频素材,腾讯视频篮球比赛
- 学linux命令作用 linux命令总结及心得
- 关于flutter控件靠右约束不生效的信息