禁用Django中的会话创建

禁用Django中的会话创建,django,session,Django,Session,我希望在Django中为某些URL禁用自动会话创建。我有/api/*和每个命中的客户端,它们将获得一个新的Django会话。有没有办法忽略某些URL?一个简单的解决方案是让Web服务器区分API调用和常规调用,然后让应用程序有两个不同的WSGI实例:一个启用会话,另一个禁用会话。(使用Nginx可能比使用Apache容易得多。) 另一种方法是继承SessionMiddleware,然后编辑流程函数以忽略所有符合条件的请求。比如: from django.contrib.sessions.midd

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

一个简单的解决方案是让Web服务器区分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)

然后编辑设置的文件,使中间件类包含指向“MySessionMiddleware”的路径,而不是“django.contrib.sessions.MIDDLEWARE.SessionMiddleware”。

我对接受的答案投了赞成票,但请注意,您也可以使用该方法在每个视图的基础上有选择地启用中间件。有关更多详细信息,请参阅StackOverflow答案。

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

request.session.save = lambda: None
琐碎的,确实有用


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

感谢您提供的信息。不过我要提醒你。如果您使用的是django身份验证,则需要会话中间件。另外,process_response需要返回响应。这看起来像我需要的。一个提示:如果request.path\u info.startswith('/api/')使用
,而不是对字符串进行切片。@evar。是的,当然应该。我已经修好了。非常感谢。(这几天我被咖啡脚本宠坏了)我对这个有意见。我有其他依赖SessionMiddleware的中间件。现在,我正在考虑继承它们并忽略路径,但这会导致其他中间件链的进一步依赖性问题。@dtc&@Declan在我的情况下,是AuthenticationMiddleware抱怨请求中没有会话。在
process\u request
方法中返回之前,我将其设置为
request.session={}