用Python在Flask中使用会话和Flash

268 阅读4分钟

用Python在Flask中使用会话和Flash

在Flask中登录和注销过程中的自定义信息

Stephen Fordham

斯蒂芬-福德姆

关注

11月11日, 2021

- 4分钟阅读

图片来自作者的个人网络应用(生产中)。内页图片由Cathryn Lavery通过unsplash提供

当用户登录到一个Web应用时,个人显示的信息可以为热情的欢迎定下基调。在Flask中,向用户显示欢迎信息可以通过多种方式实现。我向用户显示欢迎信息的两种方式是通过会话变量或导入Flask的flash函数。

我最近在构建一个Flask的Web应用,它使用了这两种方法。在我的web应用上,我有一个注册表格,用户可以在那里注册。一旦注册,用户将把他们的数据存储在一个数据库中。然后,用户可以登录以访问额外的/特权用户服务。我们可以使用在注册阶段提供的信息来设置登录时的个人信息。

图1.一旦注册,用户可以通过登录页面登录访问更多的内容

方法1:会话变量

在登录过程中,我首先检查登录表是否被正确填写。如果提供的电子邮件地址返回 "无",则使用重定向和url_for函数将用户重定向到注册页面(见gist逻辑,图2)。

接下来,我进行一个小小的验证,以确保用户为其账户提供的密码与存储在数据库中的散列密码相匹配。如果匹配,我就使用从flask_login导入的login_user函数来登录用户。

接下来我使用flask中的session变量。使用会话变量包括两个过程。首先,我使用语法:form.username.data访问用户在登录时提供的名字。这里,用户名属性来自我的用户登录表(在Flask中通常被称为模型),而数据属性则是访问名字。我把这个名字分配给了变量active_user。

然后我像使用普通的python字典一样使用会话变量。我把键设置为字符串 "username",并把这个值分配给变量active_user。然后我使用redirect和url_for函数来重定向到登陆页面。

(在我的app.py中,我有一个名为 "登陆页 "的视图函数。这就是为什么我可以像这样把登陆页写成一个字符串)。

图2.登录条件逻辑

使用使用会话变量的第二部分涉及到访问会话值并将其存储在一个变量中。

当会话变量在登录过程中被使用时,我们会重定向到Web应用程序的主页面,即登陆页面。然而,当用户第一次访问我的网站时,他们也到达了landing_page,因此没有会话对象存在。

为了解决这个常见的问题,只需将你的代码包裹在一个try-except块中,如果没有会话对象存在,可能会出现一个关键错误,这时可以捕捉到,使程序继续进行,呈现出没有任何个人欢迎信息的登陆页面。

在html代码中,我们可以使用带有条件逻辑的jinja模板,在用户已经登录的情况下向他们显示欢迎信息。如果用户已经登录,我们可以访问会话值,并将其作为一个变量传递给登陆页面。然后我们使用jinja语法,这里用双括号来显示变量active_user。

如下图所示,一旦登录就会显示一个格式很好的欢迎信息。

方法2:flash函数

我们还可以使用flash方法来向用户显示一个有用的确认注销信息。首先,我们利用从flask login导入的@login_required装饰器。这意味着,我们必须在登录后才能注销。

我们将用户注销并向flash函数写入两个参数。第一个是要显示的信息,第二个是一个类别。这在很大程度上是可选的,但却是一个好习惯。然后我们可以在再次重定向到登陆页面之前,将会话对象的值重新设置为无。

在上面的登陆页面html代码中,在第一个jinja if else块中,如果提供了一个flash信息,其类别为成功,这将被存储为一个列表项。可以提供多个带有消息的flash功能。在这个例子中,只使用了一个。

然后,可以使用下面所示的if和for jinja语法在这个列表中迭代,以显示消息。

现在出现了一个漂亮的注销信息。

你可能想添加的一个好办法是为不同的设备改变注销提示框的大小。在这里,对于大屏幕,我使用了4列提示信息,而对于移动设备,使用全部12列可能更好,如下图所示。

谢谢你的阅读,希望这个例子展示了在用Flask构建Web应用时,Python中的session和flash的一个不错的用例。