浏览器cookie被清除后,django不再发送csrf令牌

cod*_*thm 8 django cookies

在正常情况下,django将通过cookie发送csrf令牌,以后可以使用ajax post方法.但是,当我在浏览器(Chrome或Firefox)中清除cookie时,csrf令牌不再发送到浏览器,会话ID仍在发送但没有csrf令牌.有谁知道出了什么问题?

我通过将{%csrf_token%}添加到我的模板来解决了这个问题,并且SET-COOKIE标题与该页面请求一起出现.事实证明,您必须将{%csrf-token%}放入模板中,以使服务器通过SET-COOKIE标头发送令牌

Pav*_*kov 6

查看django/middleware/csrf.py在哪个CsrfViewMiddleware类中声明。正如您所看到的,def process_response(self, request, response)存在三个阻止 cookie 设置的条件:

def process_response(self, request, response):
    if getattr(response, 'csrf_processing_done', False):
        return response

    # If CSRF_COOKIE is unset, then CsrfViewMiddleware.process_view was
    # never called, probaby because a request middleware returned a response
    # (for example, contrib.auth redirecting to a login page).
    if request.META.get("CSRF_COOKIE") is None:
        return response

    if not request.META.get("CSRF_COOKIE_USED", False):
        return response

    # Set the CSRF cookie even if it's already set, so we renew
    # the expiry timer.
    response.set_cookie(settings.CSRF_COOKIE_NAME,
                        request.META["CSRF_COOKIE"],
                        max_age = 60 * 60 * 24 * 7 * 52,
                        domain=settings.CSRF_COOKIE_DOMAIN,
                        path=settings.CSRF_COOKIE_PATH,
                        secure=settings.CSRF_COOKIE_SECURE
                        )
    # Content varies with the CSRF cookie, so set the Vary header.
    patch_vary_headers(response, ('Cookie',))
    response.csrf_processing_done = True
    return response
Run Code Online (Sandbox Code Playgroud)

检查哪一个适合您。


Han*_* He 5

我有同样的问题。针对django源码调试后,原因是:

如果您的视图未呈现包含 csrf_token 模板标记的模板,Django 可能不会设置 CSRF 令牌 cookie。

两种解决方案:

  • 添加{% csrf_token %}到您的模板中
  • @ensure_csrf_cookie为您的视图使用装饰器

有关详细信息,您可以参考django doc