【问题标题】:Setting cookies within Django Middleware在 Django 中间件中设置 cookie
【发布时间】: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


    【解决方案1】:

    你误解的是会话和cookies之间的关系。

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

    您当然可以在中间件中修改会话,但无论您在哪里这样做,都不应期望看到设置了 cookie。

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

    【讨论】:

    • 感谢 Daniel 的回复——如果是这种情况,文档中的“Cookie 包含会话 ID——而不是数据本身(除非您使用基于 cookie 的后端)”是什么意思。 .后半部分让我看起来确实应该在 cookie 中看到数据本身(因为我使用的是基于 cookie 的后端)?是的,同意使用 dict 接口 - 我将编辑上面的代码。
    • 但它仍然是会话cookie,而不是每个值的特定cookie。在那个 cookie 中,会话数据以编码形式存储;你不会看到键和值。
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2018-03-03
    • 2011-08-09
    • 2011-04-01
    相关资源
    最近更新 更多