在 Django 中禁用会话创建

Posted

技术标签:

【中文标题】在 Django 中禁用会话创建【英文标题】:Disable session creation in Django 【发布时间】:2011-05-02 10:27:00 【问题描述】:

我希望在 Django 中为某些 URL 禁用自动会话创建。我有 /api/* 并且每个命中的客户端都会获得一个新的 Django 会话。有没有办法忽略某些网址?

【问题讨论】:

【参考方案1】:

一个简单的解决方案是让您的网络服务器区分 API 调用和常规调用,然后让您的应用程序有两个不同的 WSGI 实例:一个启用会话,另一个禁用会话。 (使用 nginx 可能比使用 Apache 容易得多。)

另一种方法是继承 SessionMiddleware,然后编辑流程函数以忽略所有符合您的条件的请求。比如:

from django.contrib.sessions.middleware import SessionMiddleware

class MySessionMiddleware(SessionMiddleware):
    def process_request(self, request):
        if request.path_info[0:5] == '/api/':
            return
        super(MySessionMiddleware, self).process_request(request)

    def process_response(self, request, response):
        if request.path_info[0:5] == '/api/':
            return response
        return super(MySessionMiddleware, self).process_response(request, response)

然后编辑您的设置文件,使 MIDDLEWARE_CLASSES 包含“MySessionMiddleware”的路径,而不是“django.contrib.sessions.middleware.SessionMiddleware”。

【讨论】:

感谢您的信息。 1个警告。如果您使用 django 身份验证,则需要会话中间件。 process_response 也需要返回响应。 这看起来像我需要的。一个提示:使用if reqest.path_info.startswith('/api/') 而不是对字符串进行切片。 @EvanR。是的,当然应该。我已经修好了。谢谢你。 (这些天我被 Coffeescript 宠坏了) 我遇到了这个问题。我还有其他依赖于 SessionMiddleware 的中间件。现在,我正在考虑继承那些并忽略路径,但它会导致其他中间件链的更多依赖问题。 @dtc & @Declan 在我的情况下,是 AuthenticationMiddleware 抱怨请求中不存在会话。在返回process_request 方法之前,我将其设置为request.session = 【参考方案2】:

我赞成接受的答案,但请注意,您也可以使用 decorator_from_middleware 方法在每次视图的基础上选择性地启用中间件。有关详细信息,请参阅 *** 对 Non-global middleware in Django 的回答。

【讨论】:

【参考方案3】:

也可以在自定义中间件或其他任何地方,在调用该方法的 SessionMiddleware 中处理响应之前覆盖request.session.save 方法。

request.session.save = lambda: None

微不足道,确实有效。

这种方法的好处是,尽管它实际上是一种 hack,但会话对象仍然是可访问的,并且可以按常规方式使用,而无需对代码进行任何进一步的更改。

【讨论】:

以上是关于在 Django 中禁用会话创建的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中禁用自动创建 ID?

如何仅在某些情况下禁用 Django 的 csrf 保护?

禁用在控制台中编辑会话存储变量的可能性

可以为当前会话禁用 Oracle 触发器吗?

禁用Ubuntu 15.04登录界面显示客人会话

如何禁用 Django 查询缓存?