【问题标题】:Is Django's Session model usable with memcached sessions?Django 的 Session 模型是否可用于 memcached 会话?
【发布时间】:2012-10-26 05:09:42
【问题描述】:

最近我们从 django 的默认数据库会话切换到 memcached 会话。

我们一直在使用 contrib 会话模型来删除基于 session_key 的会话:https://github.com/django/django/blob/master/django/contrib/sessions/models.py

Session.objects.get(session_key=key).delete()

一旦我们切换到 memcached 会话,上面的查询就会引发 DoesNotExist 异常。

Django 的 Session 模型是否可用于 memcached 会话?如果有,解决办法是什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    Django 提供了一个django.contrib.sessions.backends.cache 会话后端,只要缓存配置正确,它就可以满足您的需求。

    根据您的建议,Session 模型由 db 后端使用。要使用 cache 后端,您可以执行以下操作(这样您就可以继续使用 API 并使代码面向未来)。

    from django.contrib.sessions.backends.cache import SessionStore
    session = SessionStore(session_key)
    session.delete()
    

    这就是它在Sessions middleware 中的完成方式。
    无论后端如何,此方法都应有效,如果您决定在未来移至另一个后端,这可能是首选行为。

    【讨论】:

    • 我们正在使用 session.backends.cache。似乎 Session 模型仅适用于 DB 会话。
    • @BrianCray 从the source code for contrib.sessions 看来,这听起来是对的。您可能想看看SessionStore.delete 方法!
    • @BrianCray 我更新了我的答案以反映您的建议,并提供仅使用 sessions 模块提供的 API 的答案。
    【解决方案2】:
    mc = memcache.Client(settings.CACHE_BACKEND[:-1].split('//')[1].split(';'))
    mc.delete(str(key))
    

    【讨论】:

    • 这就是解决它的方法。 contrib 会话模型似乎不适用于缓存会话,只能用于 db 会话。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多