django csrf中间件无法禁用.我从我的项目中间件中评论过它,但由于缺少CSRF问题,我的登录失败了.我正在使用Django主干.如果在中间件中未启用CSRF,CSRF如何导致问题?
我必须禁用它,因为我的网站上有很多POST请求,CSRF刚刚中断.有关如何在django主干项目中完全禁用CSRF的任何反馈?
来自Django主干的"新'CSRF框架也破坏了一个外部网站,它正在进入我正在给它们的URL上进行POST(这是一个宁静的API的一部分.)我无法禁用CSRF框架我之前说过,我该如何解决这个问题?
是的,可以禁用Django csrf框架.
要手动排除视图函数不被任何CSRF中间件处理,您可以使用django.views.decorators.csrf模块中的csrf_exempt装饰器.例如:( 见文档)
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view: return Httpresponse("hello world")
..然后{% csrf_token %}
从模板中删除表单内部,或者如果您没有将其包含在表单中,请保留其他内容.
您可以在中间件中禁用它.
在您的settings.py中为MIDDLEWARE_CLASSES添加一行:
MIDDLEWARE_CLASSES = ( myapp.disable.DisableCSRF, )
使用以下内容在myapp中创建disable.py
class DisableCSRF(object): def process_request(self, request): setattr(request, '_dont_enforce_csrf_checks', True)
基本上如果你在请求中设置_dont_enforce_csrf_checks,你应该没问题.
请参阅下面的答案以获得更好的解决方案 自从我写这篇文章以来,已经发生了很多变化 现在有更好的方法来禁用CSRF.
我感觉到你的痛苦.框架改变这些基本功能是不可接受的.即使我想从现在开始使用它,我在同一台机器上有遗留站点共享django的副本.像这样的更改应该需要进行主要的版本号修订.1.x - > 2.x.
无论如何,为了修复它我只是评论它并且经常停止更新Django.
文件:django/middleware/csrf.py第160行:
# check incoming token # request_csrf_token = request.POST.get('csrfmiddlewaretoken', None) # if request_csrf_token != csrf_token: # if cookie_is_new: # # probably a problem setting the CSRF cookie # return reject("CSRF cookie not set.") # else: # return reject("CSRF token missing or incorrect.")
通常,您不应该禁用CSRF保护,因为这样做会打开安全漏洞.如果你坚持,但......
最近,一种新的CSRF保护方式落在了主干上.您的网站是否仍然配置为按旧方式执行?以下是The New Way™的文档,以下是The Old Way™的文档.