2010-10-29 105 views
17

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

回答

16

一个平凡的解决方案,这是有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”。

+2

感谢您的信息。 1警告虽然。如果您使用的是django身份验证,则需要会话中间件。另外process_response需要返回响应。 – 2010-11-18 18:57:06

+2

这看起来像我所需要的。一个提示:使用'如果reqest.path_info.startswith('/ api /')'而不是切分字符串。 – 2011-09-06 10:10:58

+0

process_response不应该返回响应对象吗? DEF process_response(个体,请求,响应): 如果request.path_info [0:5] == '/ API /': 返回响应 返回超级(MySessionMiddleware,自我).process_response(请求,响应) – 2011-10-27 20:42:08

0

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

request.session.save = lambda: None 

琐碎,确实有效。

这种方法的好处,尽管它事实上的一个黑客,是会话对象仍然可以访问,并且可以使用通常的方式,而不需要在代码中的任何进一步的修改。