我有一个具有用户登录功能并且运行良好的网站。我必须安装django rest框架,并遵循首页上非常基本的说明。一切似乎都很好,rest框架工作正常,但是,一旦我登录Django并返回到rest框架,它就会因以下错误而中断:
WrappedAttributeError at /rest-api/
'CSRFCheck' object has no attribute 'process_request'
我不知道为什么会这样或意味着什么。搜索没有帮助。
编辑:异常位置:
python3.6/site-packages/rest_framework/authentication.py in enforce_csrf, line 140
答案 0 :(得分:5)
我创建了一个要报告此问题的问题:https://github.com/encode/django-rest-framework/issues/6305
如果需要快速修补,可以在此处查看修复:https://github.com/encode/django-rest-framework/pull/6306/files
在Django Rest Framework 3.9的发行版中,身份验证过程中引入了新的函数调用:
check = CSRFCheck()
check.process_request(request)
CSRFCheck是直接从Django导入的类。 CSRFCheck类的process_request方法仅在Django 1.11.6版本中添加(此后保留)。因此,Django Rest Framework的3.9.0版本与Django 1.11.x并不完全兼容,而仅与1.11.6及更高版本兼容。存在许多解决此问题的方法:
Fork Django Rest Framework并在SessionAuthentication类(rest_framework / authentication.py)的force_csrf方法中包括以下修补程序:
from django import VERSION as django_version
if tuple(django_version[:3]) < (1, 11, 6):
csrf_token = check._get_token(request)
if csrf_token is not None:
request.META['CSRF_COOKIE'] = csrf_token
else:
check.process_request(request)
此修补程序适用于从1.11.x及更高版本(至少是Django 2.0和2.1)的任何版本的Django。
希望我的补丁将被合并并在Django Rest Framework的3.9.1版本中发布。还请记住,版本3.9.0可能是支持Django 1.11的最新版本之一。
答案 1 :(得分:0)
这看上去确实与DRF的3.8.2版本中已修复的this issue类似。
这些是我会尝试的事情:
INSTALLED_APPS
的底部底部中添加了“ rest_framework”。在安装教程中很容易错过这一点。MIDDLEWARE
中的settings.py
未被改动。至少确保django.middleware.csrf.CsrfViewMiddleware
在其中,并且如果上面有任何非Django中间件,请尝试将其尽可能下移。如果以上所有方法均无效,则可以假定您正在使用会话身份验证,尝试截断django_session
表。我认为这不会有所帮助,但是值得尝试。