我正在寻找在Django中为某些URL禁用自动会话创建。我有/ api / *和每个点击它的客户端获得一个新的Django会话。有没有办法忽略某些网址?
答案 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
琐碎,确实有用。
这种方法的好处虽然事实上是一种黑客攻击,但仍然可以访问会话对象,并且可以按常规方式使用,而无需对代码进行任何进一步的更改。