自定义身份验证类为DEFAULT_AUTHENTICATION_CLASSES?

时间:2015-06-01 06:47:33

标签: django django-rest-framework

我尝试使用django rest为我的django项目创建一个自定义身份验证类(我已在views.py文件本身中定义)作为默认身份验证类框架。虽然我不确定是否可行,但能够做到这一点似乎是合乎逻辑的。

我知道在视图中使用@authentication_classes装饰器的解决方法。但是一遍又一遍地重复同样的事情似乎是不合逻辑的。 official API GUIDE也没有提到它。如果你们中的任何一个人遇到过这种情况并且知道解决方案,我希望能够得到澄清。

REST_FRAMEWORK = {
    .
    .
    DEFAULT_AUTHENTICATION_CLASSES: (
        'appname.views.CustomAuthentication',
    ),
    .
    .
}

Could not import 'appname.views.CustomAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name views.

由于

3 个答案:

答案 0 :(得分:3)

您很可能正在进行导入循环,因此将您的身份验证类移到视图文件之外并进入身份验证类的专用文件应该可以解决问题。

导入rest_framework.views(或任何通用视图,包括视图集)时,它将自动导入所有默认身份验证类。因此,如果要在视图文件的顶部导入视图(最有可能),它将尝试导入位于导入行之后的的认证类。因为会有循环导入,所以Python会引发关于无法导入模块的异常(在这种情况下为views),这就是你得到异常的原因。

因此,只需将您的身份验证类移到其自己的文件authentication.py中,然后更改您的DEFAULT_AUTHENTICATION_CLASSES即可进行调整。

REST_FRAMEWORK = {
    .
    .
    DEFAULT_AUTHENTICATION_CLASSES: (
        'appname.authentication.CustomAuthentication',
    ),
    .
    .
}

答案 1 :(得分:0)

我偶然发现了解决方法。但我不知道它为什么会起作用。因此,诀窍是您创建了一个authentication.py文件并将CustomAuthentication放在那里。

REST_FRAMEWORK = {
    .
    .
    DEFAULT_AUTHENTICATION_CLASSES: (
        'appname.authentication.CustomAuthentication',
    ),
    .
    .
}

但我仍然想知道为什么这有效?如果我想使用包含CustomAuthentication类的文件的其他名称,该怎么办?

答案 2 :(得分:0)

您可以将默认身份验证类添加为

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ('myproj.utils.authentication.CustomAuthentication1',
'myproj.utils.authentication.CustomAuthentication2',)
}

当CustomAuthentication1失败时,它会尝试CustomAuthentication2类身份验证。

给出相对于项目的路径auth类路径。