会话
Sessions
介绍
您会发现经常需要向单个用户添加临时数据。Sessions 允许您通过添加一个键值对并将其附加到用户的IP地址来实现此目的。您可以随时重置会话数据;通常在注销或登录操作时完成。
通过 SessionProvider
服务提供程序将 Session 功能添加到框架中。此提供者必须在 AppProvider
和 RouteProvider
之间。对于Masonite 1.5+,此提供者已可用。
要注意,Session 将默认为 memory
驱动程序。这意味着,在服务器启动时,所有会话数据都存储在实例化的对象中,而在服务器停止时,则将其销毁。当使用像 Gunicorn 这样的 WSGI 服务器(可能会使用多个 Worker )时,这不是很好,因为每个 Worker 都会创建自己的内存状态,并且请求可能会意外地从一个 Worker 跳转到另一个 Worker。如果您仅使用1个 Worker ,那么只要该 Worker 在服务器生命周期内没有死亡并重置就不会有问题。要么您就应该使用诸如 cookie
的驱动而不是 memory
驱动,这样会话就会存储在 cookie 中而不是内存中。
入门
sessions 有两种情况, 会话数据 and 闪存数据。会话数据是在会话期间持续存在的数据,而闪存数据是仅在下一个请求时存在的数据。 闪存数据可用于在重定向后显示成功或警告消息之类的信息。
使用 cookie
驱动程序时,将使用您的密钥自动加密和解密会话数据。
使用会话
Sessions 已经通过 Session
键加载到了容器中。所以,您可以在容器中访问 Session
类,这些程序包括控制器、驱动程序、中间件等:
def show(self, request: Request):
print(Session) # 会话类
设置数据
通过 set
方法可以轻松的将数据持久存储到当前用户。如果使用的 memory
驱动,它将当前用户的 IP 地址连接到数据。如果使用的是 cookie
驱动,它将简单的设置一个带有 s_
前缀的 cookie,标识它是个会话数据,更好的跟其他 cookie 做区分。
def show(self, request: Request):
request.session.set('key', 'value')
这将更新连接到当前用户的字典数据。
使用字典
您还可以将字典设置为 session 的值,它将在您设置或者获取这个 键 的时候自动进行 JSON 编码和解码:
def show(self, request: Request):
request.session.set('key', {'key', 'value'})
当您从会话中获取这个键的时候,它将返回一个字典。
您也可以在闪存中使用它:
def show(self, request: Request):
request.session.flash('key', {'key', 'value'})
获取数据
从会话中获取数据:
def show(self, request: Request):
request.session.get('key') # 返回值
检查数据
很多时候,您将要查看会话中是否存在值:
def show(self, request: Request):
request.session.has('key') # 返回 True
获取所有数据
您可以获取当前用户的所有信息:
def show(self, request: Request):
request.session.all() # 返回 {'key': 'value'}
闪存数据
数据可以为下一个请求插入数据。这在使用重定向并显示成功消息时,这很有用。
def show(self, request: Request):
request.session.flash('success', 'Your action is successful')
使用 cookie
驱动程序时,该cookie将会在设置 2秒 后自动删除。
更改驱动
当然,您可以通过容器中的 SessionManager
键动态更改驱动程序:
from masonite.managers import SessionManager
def show(self, session: SessionManager):
session.driver('cookie').set('key', 'value')
值得注意的是,更改驱动不会更改模板中的 session()
函数(关于模板更多的信息如下)。
模板
SessionProvider
带有一个自动添加到所有模板中的辅助方法。您可以像使用 Session
类一样使用会话辅助方法。
该辅助方法仅指向 config/session.py
文件中设置的默认驱动程序。使用 SessionManager
类进行更改时,它不会指向正确的驱动程序。如果需要使用其他驱动程序,请考虑通过视图传递新的函数方法或更改 config / session.py
中的驱动程序值。
{% if session().has('success') %}
<div class="alert alert-success">
{{ session().get('success') }}
</div>
{% endif %}
您可以使用它来创建一个简单的 Jinja 模板,该模板可以显示成功,警告或错误消息。您的模板位于 resources / templates / helpers / messages.html
中:
{% if session().has('success') %}
<div class="alert alert-success">
{{ session().get('success') }}
</div>
{% elif session().has('warning') %}
<div class="alert alert-warning">
{{ session().get('warning') }}
</div>
{% elif session().has('danger') %}
<div class="alert alert-danger">
{{ session().get('danger') }}
</div>
{% endif %}
您可以在模板文件里添加:
{% include 'helpers/messages.html' %}
在您的控制器内部做下列调整:
def show(self):
return request().redirect('/dashboard') \
.session.flash('success', 'Action Successful!')
或者进行单独的处理:
def show(self, request: Request):
request.session.flash('success', 'Action Successful!')
return request().redirect('/dashboard')
这样将展示正确的消息和消息类型。
重置数据
您可以通过 reset
方法重置闪存数据和会话数据。
仅重置会话数据:
def show(self, request: Request):
request.session.reset()
仅重置闪存数据:
def show(self, request: Request):
request.session.reset(flash_only=True)
请注意,无论如何,在完成
200 OK
的成功请求之后,Masonite 都会重置删除数据,因此您几乎用不到flash_only=True
。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。