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_pa​​rent._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

Python / Django 中的 REST API

django-rest-swagger对API接口注释

DJANGO REST API--找不到模块错误

在 HTML 页面或模板中使用 Django-REST-Framework 从在 Django 中创建的 API 获取/显示 API 数据

django-rest-framework 和 swagger api 文档