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

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

【问题讨论】:

    标签: django session


    【解决方案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 方法在每次视图的基础上选择性地启用中间件。有关详细信息,请参阅 StackOverflow 对 Non-global middleware in Django 的回答。

    【讨论】:

      【解决方案3】:

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

      request.session.save = lambda: None
      

      微不足道,确实有效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-06
        • 2018-09-10
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        相关资源
        最近更新 更多