6

我在 Django 中使用会话来存储登录用户信息以及其他一些信息。我一直在阅读 Django session 网站,但仍有一些问题。

来自 Django 网站:

默认情况下,Django 将会话存储在您的数据库中(使用模型 django.contrib.sessions.models.Session)。虽然这很方便,但在某些设置中,将会话数据存储在其他地方会更快,因此可以将 Django 配置为将会话数据存储在文件系统或缓存中。

还:

对于持久的缓存数据,设置 SESSION_ENGINEdjango.contrib.sessions.backends.cached_db. 这使用直写缓存——每次写入缓存也将写入数据库。如果数据尚未在缓存中,则会话读取仅使用数据库。

是否有一个好的经验法则来使用哪个?cached_db似乎它总是一个更好的选择,因为最好的情况是,数据在缓存中,最坏的情况是它在数据库中。一个缺点是我必须设置 memcached。

默认情况下,SESSION_EXPIRE_AT_BROWSER_CLOSE设置为False,这意味着会话 cookie 将在用户浏览器中存储的时间为SESSION_COOKIE_AGE。如果您不希望人们每次打开浏览器时都必须登录,请使用此选项。

是否有可能两者都有,会话在浏览器关闭时过期并给出一个年龄?

如果 value 是一个整数,会话将在几秒的不活动后过期。例如,调用 request.session.set_expiry(300)将使会话在 5 分钟后到期。

什么被认为是“不活动”?

如果您使用的是数据库后端,请注意会话数据可能会累积在django_session 数据库表中,并且 Django 不提供自动清除功能。因此,定期清除过期会话是您的工作。

这意味着,即使会话过期,我的数据库中仍然有记录。究竟将代码“清除数据库”放在哪里?我觉得您需要一个单独的线程来每隔一段时间(每小时?)通过数据库并删除任何过期的会话。

4

1 回答 1

7

是否有一个好的经验法则来使用哪个?

不。

Cached_db 似乎总是一个更好的选择......

没关系。

在某些情况下,有许多 Django(和 Apache)进程查询一个公共数据库。 mod_wsgi这种方式允许很多可扩展性。缓存没有多大帮助,因为会话在 Apache(和 Django)进程中随机分布。

是否有可能两者都有,会话在浏览器关闭时过期并给出一个年龄?

不明白为什么不。

什么被认为是“不活动”?

我猜你在开玩笑。“活动”是——嗯——活动。你知道。Django 中发生的事情。Django 可以看到的 GET 或 POST 请求。还能是什么?

究竟将代码“清除数据库”放在哪里?

把它放在 crontab 或类似的东西中。

我觉得你需要一个单独的线程来每隔一段时间(每小时?)

忘记线程(请)。这是一个单独的过程。一天一次就好了。你认为你会有多少次会议?

于 2010-09-13T21:10:38.710 回答