ImportError: 没有名为 rest_framework.authtoken 的模块
我在我的项目中使用了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
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'),
...
)
由于视图的前缀。如果你想以这种方式使用 api-token-auth/
,你必须把它改成下面的样子,或者使用 Alex 提供的解决方案:
urlpatterns = patterns('',
...
url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
...
)