Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django TemplateView上的CSRF问题_Django_Csrf - Fatal编程技术网

Django TemplateView上的CSRF问题

Django TemplateView上的CSRF问题,django,csrf,Django,Csrf,我有一个非常简单的django TemplateView,如下所示: class Homeview(TemplateView): template_name = 'home.html' 我启用了csrfmiddleware,但是为什么没有在主视图上设置CSRF cookie呢?我必须依赖该页面上的csrf cookie。我不想使用{%csrf\u token%}标记来执行此操作 我试着调试这个,发现cookie从未设置过,因为它没有满足所使用的CSRF\u cookie\u的条件,这个

我有一个非常简单的django TemplateView,如下所示:

class Homeview(TemplateView):
    template_name = 'home.html'
我启用了csrfmiddleware,但是为什么没有在主视图上设置CSRF cookie呢?我必须依赖该页面上的csrf cookie。我不想使用
{%csrf\u token%}
标记来执行此操作

我试着调试这个,发现cookie从未设置过,因为它没有满足所使用的
CSRF\u cookie\u的条件,这个变量在我的
请求.META中不存在

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      # **It returned here, so COOKIE is never set!**

        # 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
附加我的上下文处理器设置:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.tz',
    'django.core.context_processors.csrf',
    'django.core.context_processors.request',
    'django.contrib.messages.context_processors.messages',
)
还发现了一些非常奇怪的事情:


如果{%csrf_令牌%}出现在我的模板中,则存在csrf_cookie

如果您使用的是1.4,请使用,否则请使用。

“我不想使用{%csrf\u token%}标记来执行此操作。”
为什么不使用?@BurhanKhalid我编写了一个通用javascript小部件,它应该处理所有csrf问题,它依赖于设置的csrf cookie。如果您使用的是1.4,请使用,否则请使用。最好不要重新发明轮子。@BurhanKhalid我想你已经回答了这个问题,确保_csrf_cookie是正确的选择,我认为django forces csrf_cookie总是为所有HTTP请求设置的。