在 Django 中禁用会话创建
Posted
技术标签:
【中文标题】在 Django 中禁用会话创建【英文标题】:Disable session creation in Django 【发布时间】:2011-05-02 10:27:00 【问题描述】:我希望在 Django 中为某些 URL 禁用自动会话创建。我有 /api/* 并且每个命中的客户端都会获得一个新的 Django 会话。有没有办法忽略某些网址?
【问题讨论】:
【参考方案1】:一个简单的解决方案是让您的网络服务器区分 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个警告。如果您使用 django 身份验证,则需要会话中间件。 process_response 也需要返回响应。 这看起来像我需要的。一个提示:使用if reqest.path_info.startswith('/api/')
而不是对字符串进行切片。
@EvanR。是的,当然应该。我已经修好了。谢谢你。 (这些天我被 Coffeescript 宠坏了)
我遇到了这个问题。我还有其他依赖于 SessionMiddleware 的中间件。现在,我正在考虑继承那些并忽略路径,但它会导致其他中间件链的更多依赖问题。
@dtc & @Declan 在我的情况下,是 AuthenticationMiddleware 抱怨请求中不存在会话。在返回process_request
方法之前,我将其设置为request.session =
。【参考方案2】:
我赞成接受的答案,但请注意,您也可以使用 decorator_from_middleware 方法在每次视图的基础上选择性地启用中间件。有关详细信息,请参阅 *** 对 Non-global middleware in Django 的回答。
【讨论】:
【参考方案3】:也可以在自定义中间件或其他任何地方,在调用该方法的 SessionMiddleware 中处理响应之前覆盖request.session.save
方法。
request.session.save = lambda: None
微不足道,确实有效。
这种方法的好处是,尽管它实际上是一种 hack,但会话对象仍然是可访问的,并且可以按常规方式使用,而无需对代码进行任何进一步的更改。
【讨论】:
以上是关于在 Django 中禁用会话创建的主要内容,如果未能解决你的问题,请参考以下文章