使用刚安装的djangorestframework登录网站时出现WrappedAttributeError

时间:2018-11-04 16:07:47

标签: python django django-rest-framework

我有一个具有用户登录功能并且运行良好的网站。我必须安装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

2 个答案:

答案 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及更高版本兼容。存在许多解决此问题的方法:

  • 如有可能,请升级到Django 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类似。

这些是我会尝试的事情:

  1. 确保将Django更新至至少1.11,并将DRF更新至至少3.8.2。
  2. 确保您在INSTALLED_APPS的底部底部中添加了“ rest_framework”。在安装教程中很容易错过这一点。
  3. 如果这是一个新项目,请确保您在MIDDLEWARE中的settings.py未被改动。至少确保django.middleware.csrf.CsrfViewMiddleware在其中,并且如果上面有任何非Django中间件,请尝试将其尽可能下移。

如果以上所有方法均无效,则可以假定您正在使用会话身份验证,尝试截断django_session表。我认为这不会有所帮助,但是值得尝试。