在Django中禁用会话创建

时间:2010-10-29 13:50:10

标签: django session

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

3 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

request.session.save = lambda: None

琐碎,确实有用。

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