我读了contrib / sessions / backend / db.py文件,我看到了
session_key=self._get_or_create_session_key(),
session_data=self.encode(self._get_session(no_load=must_create)),
expire_date=self.get_expiry_date()
这意味着Django存储session_key,session_data和expire_date。如果我有一条线
request.session['user_id'] = "my_user_id"
我使用Redis和Engine进行测试。 我的问题是它如何存储到Redis?
感谢提前!
答案 0 :(得分:0)
Django会话基本上是类字典对象,可以序列化和反序列化到会话后端(请参阅编码,解码)。
https://github.com/django/django/blob/master/django/contrib/sessions/backends/base.py#L87
会话编码器使用Python pickle(Django -1.5)和JSON(Django 1.6+)并且可以配置它:
https://docs.djangoproject.com/en/dev/ref/settings/#session-serializer
您可以在Django设置中更改会话后端:
https://docs.djangoproject.com/en/dev/ref/settings/#session-engine
默认会话后端之一是数据库引擎。
如果您想为单元测试使用不同的Django设置,有很多方法可以覆盖特定设置:
答案 1 :(得分:0)
不确定你在问什么,我假设你想知道会话是如何存储在redis中的。如果是这种情况,那么从https://gist.github.com/mikeyk/910392阅读源代码就可以提供所有答案
encoded_data = self.encode(self._session)
self.redis.setex(self._redis_key(), encoded_data, settings.SESSION_COOKIE_AGE)
首先对会话数据进行编码,然后使用SETEX
命令将其保存到redis。然后当你想要检索它
session_data = self.redis.get(self._redis_key())
if session_data is not None:
return self.decode(force_unicode(session_data))
来自redis的数据为GET
,现在是普通字符串,然后被解码为常规Python字典
如果您想查看实际数据,请使用redis-cli
并执行keys *
然后get [key]