一尘不染

无法禁用Django CSRF框架,这破坏了我的网站

django

django csrf中间件无法禁用。我已经从我的项目的中间件中将其注释掉,但是由于缺少CSRF问题,导致登录失败。我正在使用Django主干。如果未在中间件中启用CSRF,如何引起问题?

我必须禁用它,因为CSRF刚刚中断了我站点上的许多POST请求。关于如何在django主干项目中完全禁用CSRF的任何反馈?

Django主干中的“新” CSRF框架也破坏了一个外部站点,该站点正在进入并在我为其提供的URL上执行POST(这是一个静态API的一部分。)我不能禁用CSRF框架,因为我之前说过,该如何解决?


阅读 360

收藏
2020-03-29

共2个答案

一尘不染

请参阅下面的答案以获得更好的解决方案。自从我写这篇文章以来,发生了很多变化。现在有禁用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.")
2020-03-29
一尘不染

是的,可以禁用Django csrf框架。

要手动将视图功能排除在任何CSRF中间件的处理之外,可以使用django.views.decorators.csrf模块中的csrf_exempt装饰器。例如:(请参阅doc)

from django.views.decorators.csrf import csrf_exempt                                          
@csrf_exempt                                                                                  
def my_view:                                                                            
    return Httpresponse("hello world")

..,然后{% csrf_token %}从模板中删除表单内部,或者如果未将其包含在表单中,则保持其他内容不变。

2020-03-29