#django #django-rest-framework
#django #django-rest-framework
Вопрос:
Я пытаюсь ознакомиться с django-RESTframeworks, поэтому я начал официальное руководство, чтобы создать тестовый API.
https://www.django-rest-framework.org/tutorial/quickstart/#quickstart
При окончательном запуске API в моей Windows через [CMD] «pyhon manage.py runserver», я получаю код ошибки в командной строке, который вы увидите ниже.
Я также хочу добавить, что, к сожалению, в описаниях в учебном пособии есть некоторая двусмысленность, по крайней мере, с точки зрения новичка, т.Е. Не всегда точно, нужно ли добавлять соответствующий код в учебном пособии в модуль или заменять весь или часть кода в модулях.
Поэтому я пытался реализовать указания руководства различными способами, всегда с одним и тем же конечным результатом.
Я запускаю код в виртуальной среде, где я установил Django 1.11., поэтому не должно быть проблем с разными версиями Django.
C:UsersRolimarprojectsdjREST_tut>workon djresttut
(djresttut) C:UsersRolimarprojectsdjREST_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:UsersRolimaEnvsdjresttutlibsite-packagesdjangoutilsautoreload.py", line 228, in wrapper
fn(*args, **kwargs)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangocoremanagementcommandsrunserver.py", line 124, in inner_run
self.check(display_num_errors=True)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangocoremanagementbase.py", line 359, in check
include_deployment_checks=include_deployment_checks,
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangocoremanagementbase.py", line 346, in _run_checks
return checks.run_checks(**kwargs)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangocorechecksregistry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangocorechecksurls.py", line 16, in check_url_config
return check_resolver(resolver)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangocorechecksurls.py", line 26, in check_resolver
return check_method()
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangourlsresolvers.py", line 256, in check
for pattern in self.url_patterns:
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangoutilsfunctional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangourlsresolvers.py", line 407, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangoutilsfunctional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "C:UsersRolimaEnvsdjresttutlibsite-packagesdjangourlsresolvers.py", line 400, in urlconf_module
return import_module(self.urlconf_name)
File "c:python27Libimportlib__init__.py", line 37, in import_module
__import__(name)
File "C:UsersRolimaprojectsdjREST_tuttutorialurls.py", line 19, in <module>
from django.urls import include, path
ImportError: cannot import name include
И вот мои коды, которые я попытался скопировать из учебника:
«serializers.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
}
Ответ №1:
Скорее всего, вы используете django<2.0, но следуете руководствам, написанным на django> 2.0. Из django 2.0 include
был перемещен в django.urls
, прежде чем он находился в django.conf.urls
(ссылка на журнал изменений). Итак, вам нужно обновить свой 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
также не можете использовать его, потому что он также был представлен в django 2.
Или вы можете перейти на django> 2.0, но в этом случае вам придется удалить from django.conf.urls import url
и использовать from django.urls import url
.
Комментарии:
1. Спасибо! интересно, почему pip установил django 1.11 вместо django 2.x … может быть, потому, что я использую python2.7?