在Django中禁用会话创建

Mik*_*ike 17 django session

我想在Django中禁用某些URL的自动会话创建.我有/ api/*和每个点击它的客户端获得一个新的Django会话.有没有办法忽略某些网址?

Elf*_*erg 17

一个简单的解决方案是让您的网络服务器区分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)
Run Code Online (Sandbox Code Playgroud)

然后编辑您的设置文件,以便MIDDLEWARE_CLASSES包含"MySessionMiddleware"的路径,而不是"django.contrib.sessions.middleware.SessionMiddleware".

  • @dtc & @Declan 在我的例子中是 AuthenticationMiddleware 抱怨请求中没有会话。我修复了它设置 `request.session = {}`,然后在 `process_request` 方法中返回。 (3认同)
  • 谢谢(你的)信息.但有一点需要注意.如果您正在使用django身份验证,则需要会话中间件.process_response也需要返回响应. (2认同)
  • 这看起来像我需要的.一个提示:使用`if reqest.path_info.startswith('/ api /')`而不是切割字符串. (2认同)
  • 我遇到了这个问题。我有其他依赖于 SessionMiddleware 的中间件。现在,我正在考虑继承这些并忽略路径,但这会导致其他中间件链的进一步依赖问题。 (2认同)