【问题标题】:Problem with django-RESTframework-Tutorialdjango-REST framework-Tutorial 的问题
【发布时间】:2019-04-20 17:55:59
【问题描述】:

我正在尝试熟悉 django-RESTframeworks,因此我开始了官方教程,以创建一个 Test-API。

https://www.django-rest-framework.org/tutorial/quickstart/#quickstart

当最终通过 [CMD] "pyhon manage.py runserver" 在我的 Windows 上启动 API 时,我在命令行上收到一个错误代码,您将在下面看到。

我还想补充一点,不幸的是,教程中的描述存在一些歧义,至少从初学者的角度来看,即并不总是确定教程中的相应代码是否 需要在模块中添加或替换模块中的全部或部分代码。

因此,我尝试以各种方式实施本教程的指导,但结果始终相同。

我在虚拟环境中运行代码,我已经安装了 Django 1.11。所以不同的 Django 版本应该不会有问题。

C:\Users\Rolimar\projects\djREST_tut>workon djresttut
(djresttut) C:\Users\Rolimar\projects\djREST_tut>python manage.py runserver
Performing system checks...

Unhandled exception in thread started by <function wrapper at 0x0000000004CBF978>
Traceback (most recent call last):
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\utils\autoreload.py", line 228, in wrapper
fn(*args, **kwargs)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\core\management\commands\runserver.py", line 124, in inner_run
self.check(display_num_errors=True)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\core\management\base.py", line 359, in check
include_deployment_checks=include_deployment_checks,
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\core\management\base.py", line 346, in _run_checks
return checks.run_checks(**kwargs)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\core\checks\registry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\core\checks\urls.py", line 16, in check_url_config
return check_resolver(resolver)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\core\checks\urls.py", line 26, in check_resolver
return check_method()
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\urls\resolvers.py", line 256, in check
for pattern in self.url_patterns:
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\utils\functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\urls\resolvers.py", line 407, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\utils\functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Rolima\Envs\djresttut\lib\site-packages\django\urls\resolvers.py", line 400, in urlconf_module
return import_module(self.urlconf_name)
  File "c:\python27\Lib\importlib\__init__.py", line 37, in import_module
__import__(name)
  File "C:\Users\Rolima\projects\djREST_tut\tutorial\urls.py", line 19, in <module>
from django.urls import include, path
ImportError: cannot import name include    

这里是我的代码,我尝试从教程中复制:

“序列化器.py”

from django.contrib.auth.models import User, Group
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

“views.py”

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render

# Create your views here.

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

“urls.py”

            """tutorial URL Configuration

            The `urlpatterns` list routes URLs to views. For more information please see:
                https://docs.djangoproject.com/en/1.11/topics/http/urls/
            Examples:
            Function views
                1. Add an import:  from my_app import views
                2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
            Class-based views
                1. Add an import:  from other_app.views import Home
                2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
            Including another URLconf
                1. Import the include() function: from django.conf.urls import url, include
                2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
            """
            from django.conf.urls import url
            from django.contrib import admin

            from django.urls import include, path
            from rest_framework import routers
            from tutorial.quickstart import views

            router = routers.DefaultRouter()
            router.register(r'users', views.UserViewSet)
            router.register(r'groups', views.GroupViewSet)

            urlpatterns = [
                url(r'^admin/', admin.site.urls),
                path('', include(router.urls)),
                path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
            ]

在“settings.py”中,我添加了“rest_framework”

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles'
    'rest_framework',
]

最后我还添加了以下代码:

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您很可能正在使用 django,但遵循的是用 django>2.0 编写的教程。从 django 2.0 开始,include 已移至 django.urls,然后才驻留在 django.conf.urls(changelog reference)。所以你需要像这样更新你的urls.py:

            from django.conf.urls import url, include
            from django.contrib import admin
            from rest_framework import routers
            from tutorial.quickstart import views
    
            router = routers.DefaultRouter()
            router.register(r'users', views.UserViewSet)
            router.register(r'groups', views.GroupViewSet)
    
            urlpatterns = [
                url(r'^admin/', admin.site.urls),
                url(r'^', include(router.urls)),
                url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
            ]
    

    你也不能使用path,因为它也是introduced in django 2。

    或者您可以迁移到 django>2.0,但在这种情况下,您必须删除 from django.conf.urls import url 并使用 from django.urls import url。

    【讨论】:

    • 谢谢!我想知道,为什么 pip 安装了 django 1.11 而不是 django 2.x ...也许是因为我使用的是 python2.7?
    猜你喜欢
    • 2013-01-03
    • 2013-02-01
    • 2020-11-15
    • 2020-12-27
    • 2018-07-31
    • 2021-06-17
    • 2020-08-10
    • 2021-03-06
    • 2017-02-21
    相关资源
    最近更新 更多