【问题标题】:Django 'CSRFCheck' object has no attribute 'process_request'Django 'CSRFCheck' 对象没有属性 'process_request'
【发布时间】:2019-02-09 18:43:32
【问题描述】:

一切正常,直到我在 API 上实现 DjangoObjectPermissions 时突然出现上述错误。

在此之前它工作正常,即使我的生产环境也工作正常。我仅在本地环境中看到此错误。

根据this 的回答,错误会消失,但我需要知道为什么?

请让我知道我应该在这篇文章中添加哪些信息。

以下是安装的相关包。

Django==1.10
django-allauth==0.29.0
django-angular==0.8.3
django-debug-toolbar==1.6
django-debug-toolbar-request-history==0.0.3
django-debug-toolbar-template-profiler==1.0.1
django-debug-toolbar-template-timings==0.7
djangorestframework==3.5.3

【问题讨论】:

  • 可能DjangoObjectPermissions 试图在某个地方调用CSRFCheck.process_request。它应该在错误回溯中。
  • 实际上,我上面提到的链接告诉DRF > 3.5.3Django < 1.11.5 会导致此错误。我在实现DjangoObjectPermissions 时发现,我安装了django-rest-swagger,它依赖于DRF > 3.9.5,我的DRF 升级到3.9.5,因此出现上述错误。

标签: python django django-rest-framework


【解决方案1】:

Add try/except statement to enforce_csrf()

请注意,此错误源自 SessionAuthentication 类中的 rest_framework/authentication.py,方法 enforce_csrf()。 enforce_csrf() 方法初始化变量,check = CSRFCheck(),下一行是“check.process_request(request)”。

如果使用 IDE,您会很快注意到 CSRFCheck() 没有此属性/方法,因此会出现错误。许多开发人员会很快告诉您升级到 django >= 1.11.6,但您一定会遇到同样的错误。 就此而言,我正在使用 django 1.11.6 和 rest_framework 3.9.1。

所以试试这个补救措施,它对我有用。使用 try/except 语句。 进入下面的 rest_framework/authentication.py,检查 = CSRFCheck(), 添加这个...

def enforce_csrf(self, request):
   ...
   try:
       check.process_request(request)
   except:
       pass

台词是这样说的: 声明“check”变量后,调用(try)这个方法“process_request()”,如果它不起作用(例外),就通过。你用这个实现了两件事:第一,你真的让 rest_framework 源代码兼容(假设升级到 django 的更多版本“可能”解决这个问题),第二,你得到工作代码(很好!!,特别是如果工作敏捷)

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 2015-02-19
    • 2016-03-30
    • 2021-04-05
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多