【问题标题】:How to disable importing authtoken.models when using SessionAuthentication with django-rest-framework?将 SessionAuthentication 与 django-rest-framework 一起使用时如何禁用导入 authtoken.models?
【发布时间】:2013-02-16 02:33:34
【问题描述】:

在我的 rest_framework 设置中,我将 SessionAuthentication 设置为默认身份验证类

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.SessionAuthentication',
)

问题是我的 User DELETE api 视图试图折叠不存在的 authtoken_token 表上的删除(因为我不需要它),从而引发数据库异常。

具体来说,当在 DestroyModelMixin.destroy 中调用 obj.delete() 时,会引发此异常:

DatabaseError: relation "authtoken_token" does not exist
LINE 1: ...oken"."user_id", "authtoken_token"."created" FROM "authtoken...

是否需要同步数据库 rest_framework 的模型,即使不需要它们?

有没有办法在不包含 authtoken.models 的情况下使用 SessionAuthentication?

我做错了吗?

(从 rest_framework/authentication.py 中完全删除 authtoken.models.Token 似乎可以解决问题)

【问题讨论】:

  • 不,你不需要syncdb,除非你在INSTALLED_APPS设置中明确安装了rest_framework.authtoken。您是否不小心在您的 INSTALLED_APPS 中得到了它,或者您是否无意中创建了 ForeignKey 或其他关系?完整的追溯是什么?
  • 我没有在我的 INSTALLED_APPS 中明确安装 rest_framework.authtoken(仅 rest_framework)。但我开始怀疑在我们相当复杂的 django 项目的背景中发生了一些自动化。关于如何调试的任何想法?这是来自 DestroyModelMixin 的回溯:gist.github.com/nejcjelovcan/5dc47eea7134e12f5d6b
  • 视图使用的模型的模型定义是什么?
  • 显然,这仅发生在测试中,当我使用 django.test.client.Client (afaik 模拟实际的 HTTP 请求)执行 DELETE 请求时,并且仅当 rest_framework.authentication 在测试。对 API 的实际 HTTP DELETE 请求按预期工作(删除用户时不会因缺少 authtoken_token 而引发异常)。我将尝试在一个干净的 django 项目中重现该行为,因为这太复杂了,我无法在此处充分描述它。感谢所有的帮助和这个伟大的框架!

标签: django-models django-rest-framework


【解决方案1】:

这是根本原因...

https://code.djangoproject.com/ticket/19422

在此期间将整理出一个解决方法,这可能只涉及确保Token 不会被导入任何地方,除非rest_framework.authtokenINSTALLED_APPS 中。

【讨论】:

  • 如果有人遇到这个问题,tom在this revision修复它,最简单的解决方案是升级到2.2.4(或更高版本)
猜你喜欢
  • 2019-07-13
  • 2013-10-12
  • 2016-02-28
  • 2014-12-08
  • 2015-03-29
  • 2012-08-02
  • 2018-03-23
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多