【发布时间】:2011-05-02 10:27:00
【问题描述】:
我希望在 Django 中为某些 URL 禁用自动会话创建。我有 /api/* 并且每个命中的客户端都会获得一个新的 Django 会话。有没有办法忽略某些网址?
【问题讨论】:
我希望在 Django 中为某些 URL 禁用自动会话创建。我有 /api/* 并且每个命中的客户端都会获得一个新的 Django 会话。有没有办法忽略某些网址?
【问题讨论】:
一个简单的解决方案是让您的网络服务器区分 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”。
【讨论】:
if reqest.path_info.startswith('/api/') 而不是对字符串进行切片。
process_request 方法之前,我将其设置为request.session = {}。
我赞成接受的答案,但请注意,您也可以使用 decorator_from_middleware 方法在每次视图的基础上选择性地启用中间件。有关详细信息,请参阅 StackOverflow 对 Non-global middleware in Django 的回答。
【讨论】:
也可以在自定义中间件或其他任何地方,在调用该方法的 SessionMiddleware 中处理响应之前覆盖request.session.save 方法。
request.session.save = lambda: None
微不足道,确实有效。
这种方法的好处是,尽管它实际上是一种 hack,但会话对象仍然是可访问的,并且可以按常规方式使用,而无需对代码进行任何进一步的更改。
【讨论】: