什么是数据库中的会话存储?

时间:2013-12-08 16:56:28

标签: django

我读了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?

感谢提前!

2 个答案:

答案 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设置,有很多方法可以覆盖特定设置:

How to Unit test with different settings in 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]