Django Rest API urlsplit 错误
Posted
技术标签:
【中文标题】Django Rest API urlsplit 错误【英文标题】:Django Rest API urlsplit error 【发布时间】:2015-02-14 08:29:15 【问题描述】:我正在尝试使用 Django Rest 设置 API,我尝试使用快速入门指南,但我得到的只是这个错误:
'Module_six_moves_urllib_parse' object has no attribute 'urlsplit'
我在互联网上找不到任何有关此错误的参考,更不用说如何解决了。
这是我的网址文件:
from django.conf.urls import patterns, include, url
from django.contrib.auth.models import User
from django.contrib import admin
from rest_framework import routers, serializers, viewsets
admin.autodiscover()
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'is_staff')
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = patterns('',
url(r'^', include(router.urls)),
url(r'^', include('logs.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)
完整的追溯:
环境:
请求方法:GET
Django 版本:1.6 Python 版本:2.7.6 已安装的应用程序: ('rest_framework', 'south', 'django.contrib.admin', 'django.contrib.admindocs', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages'、'django.contrib.staticfiles'、'logs'、 'django_nose') 已安装的中间件: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware')
模板错误:在模板中 /Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/rest_framework/templates/rest_framework/base.html, 第 87 行的错误“Module_six_moves_urllib_parse”对象没有 属性 'urlsplit' 77 : rel="nofollow" title="在 name 上发出 GET 请求 资源">获取
78:
79:
80 : title="指定一个 GET 请求的格式">
81:
82:
83:
84 : % 表示格式 可用格式%
85:
86 :
87 : href=' % add_query_param 请求 api_settings.URL_FORMAT_OVERRIDE 格式 % '
88 : rel="nofollow"
89 : title="制作一个 对 name 资源的 GET 请求,格式设置为
format
">90 : 格式
91:
92:
93 : % endfor %
94:
95:
96:
97:
追溯:文件 “/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/core/handlers/base.py” 在 get_response 139. response = response.render() 文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/response.py” 在渲染中 105. self.content = self.rendered_content 文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/rest_framework/response.py” 在渲染内容中 59. ret = renderer.render(self.data, media_type, context) 文件 “/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/rest_framework/renderers.py” 在渲染中 733. ret = template.render(context) 文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在渲染中 140.返回self._render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在_render 134.返回self.nodelist.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在渲染中 840. bit = self.render_node(节点,上下文)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/debug.py” 在渲染节点 78.返回node.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/loader_tags.py” 在渲染中 123.返回compiled_parent._render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在_render 134.返回self.nodelist.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在渲染中 840. bit = self.render_node(节点,上下文)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/debug.py” 在渲染节点 78.返回node.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/loader_tags.py” 在渲染中 62. 结果 = block.nodelist.render(context) 文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在渲染中 840. bit = self.render_node(节点,上下文)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/debug.py” 在渲染节点 78.返回node.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/defaulttags.py” 在渲染中 305.返回nodelist.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在渲染中 840. bit = self.render_node(节点,上下文)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/debug.py” 在渲染节点 78.返回node.render(context)文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/defaulttags.py” 在渲染中 196. nodelist.append(node.render(context)) 文件 “/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/django/template/base.py” 在渲染中 1125. 返回 func(*resolved_args, **resolved_kwargs) 文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py” 在 add_query_param 86. return escape(replace_query_param(uri, key, val)) 文件“/Users/taylorhobbs/.virtualenvs/Workout_log/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py” 在 replace_query_param 22. (scheme, netloc, path, query, fragment) = urlparse.urlsplit(url)
异常类型:AttributeError at / 异常值: 'Module_six_moves_urllib_parse' 对象没有属性 'urlsplit'
【问题讨论】:
请编辑您的问题并添加完整的回溯(错误消息)。 确保您安装的 6 版本是最新的 【参考方案1】:所以我已经解决了我的问题,无论如何,我将我的 DRF 版本从 3 更改为 2.4,它似乎已经解决了我的问题。如果其他人有合法的答案,请分享。
【讨论】:
“我将 DRF 版本从 3 更改为 2.4” - 根据上面的答案 - 只需将 Django 1.6 升级到最新的 1.6.x 版本。 我降级了 DRF,现在我遇到了另一个问题(“ListField”不是序列化器字段)。 叹息【参考方案2】:尝试升级您的 Django 版本。 Base 1.6 没有这个功能,但是 1.6.3 有。 https://docs.djangoproject.com/en/dev/releases/1.6.3/
【讨论】:
FWIW,您可能希望升级到最新版本(撰写本文时为 1.6.8) - 您希望拥有许多安全修复程序。 确认是的,我现在正在更新 Django REST 框架文档以获取最低支持版本。【参考方案3】:是的,这正是我遇到的错误。我正在使用 python 2.6 , Django 1.6。我将尝试更改为 DRF 2.4
P.S:当我使用 Python 3.4 和 django 1.7 和最新的 DRF 时。没有错误。 P.S.S - 删除 3.0.1 并安装 2.4.4,然后将其添加到 settings.py。它奏效了。
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
【讨论】:
以上是关于Django Rest API urlsplit 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django-rest-framework 中为 API 使用 TokenAuthentication
在 HTML 页面或模板中使用 Django-REST-Framework 从在 Django 中创建的 API 获取/显示 API 数据