request.session 可以存储多少?
How much can request.session store?
我刚开始学习 Django 会话(以及一般的 Django)。在我看来 request.session 的功能就像一本字典,但我不确定我能在上面保存多少数据。到目前为止,我看过的大多数示例都使用 request.session 来存储相对较小的数据,例如短字符串或整数。那么我可以在 request.session 上保存的数据量是否有限制,或者它是否与我使用的数据库更相关?
我有这个问题的部分原因是因为我不完全理解 request.session 的存储是如何工作的。它像另一个模型一样工作吗?如果是这样,我如何访问管理页面上的 keys/items?
提前感谢您的帮助!
简而言之:这取决于你使用的后端,你用[=29=]指定这个。后端可以是(但不限于):
'django.contrib.sessions.backends.db'
'django.contrib.sessions.backends.file'
'django.contrib.sessions.backends.cache'
'django.contrib.sessions.backends.cached_db'
'django.contrib.sessions.backends.signed_cookies'
根据每个后端的实现方式,应用不同的最大值。
此外 SESSION_SERIALIZER
也很重要,因为这决定了数据的编码方式。有两个内置序列化器:
'django.contrib.sessions.serializers.JSONSerializer'
;和
''django.contrib.sessions.serializers.PickleSerializer
'.
序列化程序
序列化程序决定会话数据如何转换为流,因此对压缩率有一定影响。
对于 JSONSerializer
,它将创建一个 JSON 转储,然后使用 base64 压缩进行压缩,并使用 hmac/SHA1 签名。与原始 JSON blob 相比,此压缩率可能会有 ~33% 的开销。
PickleSerializer
会先pickle这个对象,然后再压缩并签名。 Pickling 往往不如 JSON 编码紧凑,但另一方面,pickling 可以将不是字典、列表等的对象转换为流。
后端
一旦数据被序列化,后端就会确定它的存储位置。一些后端有限制。
django.contrib.sessions.backends.db
这里Django使用数据库模型来存储session数据。如果数据库最多可以存储 4 GiB 的值(例如 MySQL),那么它可能会在每个会话中存储最多 3 GiB 的 JSON blob。请注意,当然应该有足够的磁盘 space 来存储 table.
django.contrib.sessions.backends.file
此处数据写入文件。没有实施限制,但当然应该有足够的磁盘space。一些操作系统可以对目录中的文件可以分配的磁盘数量添加某些限制 space。
django.contrib.sessions.backends.cache
此处它存储在您在 CACHES
setting [Django-doc] 中指定的缓存之一中,具体取决于您选择的缓存系统,可以应用某些限制。
django.contrib.sessions.backends.cache_db
这里你使用了cache
和db
的组合:你使用了缓存,但是数据是有数据库做备份的,这样如果缓存失效了,数据库仍然包含数据。因此,这意味着 两个 后端的限制都适用。
django.contrib.sessions.backends.signed_cookies
在这里,您将签名的 cookie 存储在客户端的浏览器中。 cookies 的限制在这里由浏览器指定。
RFC-2965 on HTTP State Management Mechanism 指定浏览器通常应能够为每个 cookie 存储至少 4096 字节。但是对于签名部分,这个门槛可能根本就不够用。
如果您使用浏览器的 cookie,您只能存储非常有限的数据。
我刚开始学习 Django 会话(以及一般的 Django)。在我看来 request.session 的功能就像一本字典,但我不确定我能在上面保存多少数据。到目前为止,我看过的大多数示例都使用 request.session 来存储相对较小的数据,例如短字符串或整数。那么我可以在 request.session 上保存的数据量是否有限制,或者它是否与我使用的数据库更相关?
我有这个问题的部分原因是因为我不完全理解 request.session 的存储是如何工作的。它像另一个模型一样工作吗?如果是这样,我如何访问管理页面上的 keys/items?
提前感谢您的帮助!
简而言之:这取决于你使用的后端,你用[=29=]指定这个。后端可以是(但不限于):
'django.contrib.sessions.backends.db'
'django.contrib.sessions.backends.file'
'django.contrib.sessions.backends.cache'
'django.contrib.sessions.backends.cached_db'
'django.contrib.sessions.backends.signed_cookies'
根据每个后端的实现方式,应用不同的最大值。
此外 SESSION_SERIALIZER
也很重要,因为这决定了数据的编码方式。有两个内置序列化器:
'django.contrib.sessions.serializers.JSONSerializer'
;和''django.contrib.sessions.serializers.PickleSerializer
'.
序列化程序
序列化程序决定会话数据如何转换为流,因此对压缩率有一定影响。
对于 JSONSerializer
,它将创建一个 JSON 转储,然后使用 base64 压缩进行压缩,并使用 hmac/SHA1 签名。与原始 JSON blob 相比,此压缩率可能会有 ~33% 的开销。
PickleSerializer
会先pickle这个对象,然后再压缩并签名。 Pickling 往往不如 JSON 编码紧凑,但另一方面,pickling 可以将不是字典、列表等的对象转换为流。
后端
一旦数据被序列化,后端就会确定它的存储位置。一些后端有限制。
django.contrib.sessions.backends.db
这里Django使用数据库模型来存储session数据。如果数据库最多可以存储 4 GiB 的值(例如 MySQL),那么它可能会在每个会话中存储最多 3 GiB 的 JSON blob。请注意,当然应该有足够的磁盘 space 来存储 table.
django.contrib.sessions.backends.file
此处数据写入文件。没有实施限制,但当然应该有足够的磁盘space。一些操作系统可以对目录中的文件可以分配的磁盘数量添加某些限制 space。
django.contrib.sessions.backends.cache
此处它存储在您在 CACHES
setting [Django-doc] 中指定的缓存之一中,具体取决于您选择的缓存系统,可以应用某些限制。
django.contrib.sessions.backends.cache_db
这里你使用了cache
和db
的组合:你使用了缓存,但是数据是有数据库做备份的,这样如果缓存失效了,数据库仍然包含数据。因此,这意味着 两个 后端的限制都适用。
django.contrib.sessions.backends.signed_cookies
在这里,您将签名的 cookie 存储在客户端的浏览器中。 cookies 的限制在这里由浏览器指定。
RFC-2965 on HTTP State Management Mechanism 指定浏览器通常应能够为每个 cookie 存储至少 4096 字节。但是对于签名部分,这个门槛可能根本就不够用。
如果您使用浏览器的 cookie,您只能存储非常有限的数据。