首页 文章

在Django Middleware中设置cookie

提问于
浏览
3

我想使用Custom Django Middleware(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'

我_1661145_m故意尝试修改请求和响应只是为了让它工作:

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 是_1161148_已经误解了应该如何编写 .

我可以在这样的中间件中操纵会话,让它在Django要发送的响应中发送的cookie中生效吗?该文档听起来像我应该能够:

它应返回None或HttpResponse对象 . 如果它返回None,Django将继续处理此请求,执行任何其他process_request()中间件,然后是process_view()中间件,最后是相应的视图 . 如果它返回一个HttpResponse对象,Django将不会打扰任何其他请求,视图或异常中间件或适当的视图;它会将响应中间件应用于该HttpResponse,并返回结果 .

我还看到文档中的注释在视图函数之外使用 SessionStore() . 从理论上讲,我没有't think I should need to do that here because I'可以访问 request (和 response ) . 无论如何我试过了,我仍然无法让它工作 .

非常感谢!

1 回答

  • 2

    你误解的是会话和cookie之间的关系 .

    您无法通过修改会话来设置任意cookie . 会话是数据的集合,通常存储在db或文件中,唯一的cookie是包含当前用户的会话密钥的cookie .

    您当然可以在中间件中修改会话,但无论您在何处执行此操作,都不应期望看到cookie被设置 .

    (另外,你不应该直接调用双下划线方法,如 __setitem__ . 会话通过类似dict的接口访问: request.session['foo'] = 'bar' . )

相关问题