我已经注解掉了settings.py
中的csrf处理器和中间件行:
122
123 TEMPLATE_CONTEXT_PROCESSORS = (
124 'django.contrib.auth.context_processors.auth',
125 # 'django.core.context_processors.csrf',
126 'django.core.context_processors.request',
127 'django.core.context_processors.static',
128 'cyathea.processors.static',
129 )
130
131 MIDDLEWARE_CLASSES = (
132 'django.middleware.common.CommonMiddleware',
133 'django.contrib.sessions.middleware.SessionMiddleware',
134 # 'django.middleware.csrf.CsrfViewMiddleware',
135 'django.contrib.auth.middleware.AuthenticationMiddleware',
136 'django.contrib.messages.middleware.MessageMiddleware',
137 'django.middleware.locale.LocaleMiddleware',
138 # Uncomment the next line for simple clickjacking protection:
139 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )
但是当我使用 AJAX 发送请求时,Django仍然会响应“csrf token is correct or missing”(csrf令牌不正确或丢失),并且在将X-CSRFToken添加到消息头后,请求会成功。
这是怎么回事?
9条答案
按热度按时间ecbunoof1#
如果您只是需要一些视图而不使用CSRF,则可以使用
@csrf_exempt
:你可以在Django文档中找到更多的例子和其他场景:
2ic8powd2#
在MIDDLEWARE的
setting.py
中,您可以简单地删除/注解此行:vojdkbi03#
要为基于类的视图禁用CSRF,以下方法对我很有效。
我使用的是Django 1.10和Python 3.5.2
kknvjkwl4#
这里的问题是SessionAuthentication执行它自己的CSRF验证。这就是为什么即使CSRF中间件被注解,你也会得到CSRF丢失错误。你可以在每个视图中添加@csrf_exempt,但是如果你想禁用CSRF并对整个应用进行会话验证,你可以添加一个额外的中间件,如下所示-
我在myapp/ www.example.com中创建了这个类middle.py,然后在www.example.com的中间件中导入这个中间件settings.py
在django1.11上可以和DRF一起使用
mtb9vblg5#
对于Django 2:
必须在适当的时候(例如在测试设置中)将该中间件添加到
settings.MIDDLEWARE
。MIDDLEWARE_CLASSES
。*n9vozmp46#
这个答案可能不太恰当,但我希望它能帮助你
拥有这样的中间件有助于调试请求和检查生产服务器中的csrf。
pgvzfuti7#
如果您想在Global中禁用它,可以编写一个定制的中间件,如下所示
然后将该类
youappname.middlewarefilename.DisableCsrfCheck
添加到MIDDLEWARE_CLASSES
列表中,位于django.middleware.csrf.CsrfViewMiddleware
之前niknxzdl8#
使用此解决方案之前,请阅读文档中的此链接
我通过以下两个步骤解决了这个问题:
1.将此类添加到
utils.py
文件:1.在
settings.py
文件中,将上述中间件添加到MIDDLEWARE
列表中:zd287kbt9#
CSRF可以在视图级别强制执行,不能全局禁用。
在某些情况下,这是一个痛苦,但嗯,“这是为了安全”。必须保留那些AAA评级。
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps