每个用户的Python烧瓶会话及其自己的对象

时间:2016-12-21 15:15:48

标签: python session flask

我希望有人可以指出我正确的方式来实施这种情况。

我为多个并发用户构建了一个烧瓶应用程序。该应用程序基本上包装了一个需要身份验证的后端RESTful服务,并允许发送命令。用户不需要登录烧瓶应用程序本身,但是他们确实提供了用于向Restful服务验证对象的凭据。因此,每个用户需要他们自己的特定会话的唯一对象。为了便于使用/懒惰,我还在一些session['x']变量中存储了一些琐碎的信息。

会话信息并非每个用户都是唯一的,并且它显示为" login"以前的用户'认证对象。

构建它的正确方法是什么?我可以将session变量移动到对象中,但仍然存在所有用户都需要自己的后端对象的问题。我是否需要实施真正的烧瓶登录?

1 个答案:

答案 0 :(得分:2)

我过去曾使用flask-login扩展来实现登录和会话管理系统。

将用户信息存储在python对象(如会话)中的一个问题是,您永远无法将应用程序扩展到一个进程之外。几乎在所有情况下,您都希望有多个进程处理请求。每个进程都将使用自己的python解释器运行,并且不会共享会话对象。你真的想要一个由所有进程共享的数据库来存储会话信息,redis非常适合这个目的。

对于flask-login,您需要实现user class和两个函数(最好实现为用户类的方法):

  • 一个登录函数,它将根据您的服务验证提供的用户名和密码,然后使用cryptographically secure pseudo-random number generator(即os.urandom())生成一个大的随机数(16-32字节)来使用作为会话ID。使用生成的会话ID作为会话表或数据库中用户会话信息的关键字,并将其用作User类的ID。登录函数应返回您的User对象。我通常将它实现为User类的类方法。

  • load_user回调,它将获取在上述函数中生成的会话ID,并返回表示您的用户的类,该类填充了存储会话信息的数据库中的信息

Flask-login将处理(作为HMAC)您的会话ID作为cookie安全地存储在用户的计算机上,并且在请求开始时它将调用您的load_user回调以检索用户的信息。登录用户'通过从flask_login(from flask_login import current_user)导入current_user代理,可以获得信息。此对象也可用于jinja模板。