导入错误:找不到rest_framework.authtoken模块。

11

我在项目中使用django rest-framework(DRF)的令牌认证,在创建用户时创建令牌。一切工作正常,直到我添加DRF文档中的这行代码:

url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),

创建一个端点,当正确提交用户名和密码后,返回用户令牌。

它会抛出这个错误:

ImportError: No module named rest_framework.authtoken

这很奇怪,因为DRF没有问题,所以必须将其包含在我的PYTHONPATH中。

我还运行了python manage.py syncdb和适当的迁移。

有什么想法是什么出了问题?

Settings.py:

THIRD_PARTY_APPS = (
        'south',  # Database migration helpers:
        'crispy_forms',  # Form layouts
        'avatar',  # for user avatars
        'rest_framework', # for rest
        'django_rq', # for aysnc
        'rest_framework_swagger', # for exploring the api
        'rest_framework.authtoken',
    )
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS

完整的堆栈跟踪:

Unhandled exception in thread started by <function wrapper at 0x1046096e0>
Traceback (most recent call last):
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/utils/autoreload.py", line 93, in wrapper
    fn(*args, **kwargs)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 101, in inner_run
    self.validate(display_num_errors=True)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/management/base.py", line 310, in validate
    num_errors = get_validation_errors(s, app)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/management/validation.py", line 34, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/db/models/loading.py", line 196, in get_app_errors
    self._populate()
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/db/models/loading.py", line 78, in _populate
    self.load_app(app_name)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/db/models/loading.py", line 99, in load_app
    models = import_module('%s.models' % app_name)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/utils/importlib.py", line 40, in import_module
    __import__(name)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/debug_toolbar/models.py", line 63, in <module>
    patch_root_urlconf()
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/debug_toolbar/models.py", line 51, in patch_root_urlconf
    reverse('djdt:render_panel')
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 480, in reverse
    app_list = resolver.app_dict[ns]
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 310, in app_dict
    self._populate()
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 273, in _populate
    for name in pattern.reverse_dict:
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 296, in reverse_dict
    self._populate()
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 285, in _populate
    lookups.appendlist(pattern.callback, (bits, p_pattern, pattern.default_args))
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 229, in callback
    self._callback = get_callable(self._callback_str)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/utils/functional.py", line 32, in wrapper
    result = func(*args)
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 100, in get_callable
    not module_has_submodule(import_module(parentmod), submod)):
  File "/Users/admin/dev/ncla-web/env/lib/python2.7/site-packages/django/utils/importlib.py", line 40, in import_module
    __import__(name)
ImportError: No module named rest_framework.authtoken

你是否将'rest_framework.authtoken'添加到了INSTALLED_APPS中?不确定为什么会导致导入问题,但只是确认一下。 - Alex
当然,我会将那部分也发布出来。 - agconti
1个回答

9

请查看最后的回复这里。不要将整个视图作为字符串包含,先导入'obtain_auth_token',然后只需引用即可。

from rest_framework.authtoken.views import obtain_auth_token

...
url(r'^api-token-auth/', obtain_auth_token),
...

agconti的最新更新:

这个问题源于使用:

urlpatterns = patterns("api.views",
    ...
    url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
    ...
)

这是因为views前缀的原因。如果您希望以这种方式使用api-token-auth/,则必须将其更改如下,或使用Alex提供的解决方案:

urlpatterns = patterns('',
    ...
    url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
    ...
)

干得好,先生。我也会打开这个问题,以便它可以被修复。 - agconti
好的。我发现还有其他一些人遇到了问题,但没有得到真正的答案,例如这里,所以在SO上得到这个解决方案很不错。真的很奇怪,为什么对于一些人来说会出现这种情况,而对于其他人则不会。 - Alex
问题还源于像文档建议的那样将“api.views”作为URL模式的前缀。将前缀更改为标准的“”,一切都正常工作。 - agconti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接