【发布时间】:2017-06-22 03:41:44
【问题描述】:
我想使用自定义 Django 中间件 (Django 1.9) 来检查匿名用户是否已接受网站的条款和条件 - 如果用户尚未单击“同意”,我将向他们显示一个对话框。
我不需要将它存储在数据库中,我更愿意简单地使用 Cookie。我在settings.py 中有以下内容:
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
...
'myapp.middleware.app_custom_middleware.TermsMiddleware',]
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
然后我在TermsMiddleware中尝试一些非常基本的东西-在这里我故意尝试修改请求和响应只是为了让它工作:
class TermsMiddleware(object):
def process_request(self, request):
request.session['myCookieKey'] = 'myCookieValue'
request.session.save()
return
def process_response(self, request, response):
request.session['myCookieKey'] = 'myCookieValue'
request.session.save()
return response
如果我在浏览器中检查响应,我发现 myCookieKey 没有被设置,所以我想我误解了应该如何写。
我可以像这样在中间件中操作会话,让它在 Django 将要发送的响应中发送的 cookie 中生效吗?文档听起来我应该能够:
它应该返回 None 或 HttpResponse 对象。如果它返回 无,Django 将继续处理这个请求,执行任何 其他 process_request() 中间件,然后, process_view() 中间件, 最后,适当的观点。如果它返回一个 HttpResponse 对象,Django 不会打扰调用任何其他请求、视图或 异常中间件,或适当的视图;它会应用响应 中间件到那个 HttpResponse,并返回结果。
我还在文档中看到了在视图函数之外使用SessionStore() 的注释。从理论上讲,我认为我不需要在这里这样做,因为我可以访问request(和response)。反正我试过了,还是不行。
帮助非常感谢!
【问题讨论】:
标签: python django session django-middleware