#django #django-rest-framework
#джанго #django-rest-фреймворк
Вопрос:
Я новичок в джанго. Я пытаюсь создать простую конечную точку api rest, но получаю 404. Я уверен, что мне не хватает какой-то настройки. models.py
class DisplayItems(models.Model): yesNo = models.CharField(max_length=10) yogaMessage = models.CharField(max_length=50) yogaTimeMessage = models.CharField(max_length=100) @classmethod def create(cls, yesNo, yogaMessage, yogaTimeMessage): displayItems = cls(yesNo=yesNo, yogaMessage=yogaMessage, yogaTimeMessage=yogaTimeMessage) return displayItems
serializers.py
from .models import DisplayItems class DisplayItemsSerializer(serializers.ModelSerializer): yesNo = serializers.CharField(max_length=10) yogaMessage = serializers.CharField(max_length=50) yogaTimeMessage = serializers.CharField(max_length=100) class Meta: model = DisplayItems fields = ('__all__')
urls.py
from .views import DisplayItemsViews from django.contrib import admin urlpatterns = [ path(r'^admin/', admin.site.urls), path(r'^zzz/', DisplayItemsViews.as_view()), ]
views.py
from rest_framework.response import Response from rest_framework import status from .serializers import DisplayItemsSerializer from .models import DisplayItems class DisplayItemsViews(APIView): def get(self, request): displayItems = DisplayItems.create("YES!", "There's yoga today", "At 2:00 pm Eastern Time") serializer = DisplayItemsSerializer(displayItems) return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
URL, который я пытаюсь запустить, это http://127.0.0.1:8000/zzz/
Я прочитал почти все соответствующие сообщения stackoverflow, но, похоже, не могу понять, чего мне не хватает.
Ответ №1:
Три вещи:
1 — Установили ли вы rest_framework
в своем INSTALLED_APPS
из ваших settings.py
?
2 — Ваш path()
в вашем urls.py
не должен содержать r'^
часть, означающую, что правильные пути- path('admin/', admin.site.urls)
и path('zzz/', DisplayItemsViews.as_view())
. Это старое поведение с тех пор, как Джанго предложил использовать url()
вместо path()
3 — Я предполагаю , что вы ввели APIView
свой views.py
, если нет, вам нужно from rest_framework.views import APIView
РЕДАКТИРОВАТЬ: Моя рабочая локальная версия.
views.py
from rest_framework.response import Response from rest_framework import status from rest_framework.views import APIView from .serializers import DisplayItemsSerializer from .models import DisplayItems class DisplayItemsViews(APIView): def get(self, request): displayItems = DisplayItems.create("YES!", "There's yoga today", "At 2:00 pm Eastern Time") serializer = DisplayItemsSerializer(displayItems) return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
settings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'base', 'rest_framework' ]
urls.py
from django.contrib import admin from django.urls import path from base.views import DisplayItemsViews urlpatterns = [ path('admin/', admin.site.urls), path('zzz/', DisplayItemsViews.as_view()) ]
models.py
class DisplayItems(models.Model): yesNo = models.CharField(max_length=10) yogaMessage = models.CharField(max_length=50) yogaTimeMessage = models.CharField(max_length=100) @classmethod def create(cls, yesNo, yogaMessage, yogaTimeMessage): displayItems = cls(yesNo=yesNo, yogaMessage=yogaMessage, yogaTimeMessage=yogaTimeMessage) return displayItems
serializers.py
from rest_framework import serializers from .models import DisplayItems class DisplayItemsSerializer(serializers.ModelSerializer): yesNo = serializers.CharField(max_length=10) yogaMessage = serializers.CharField(max_length=50) yogaTimeMessage = serializers.CharField(max_length=100) class Meta: model = DisplayItems fields = ('__all__')
Комментарии:
1. Спасибо, Джо, за ваш ответ 1. да, у меня есть право settings.py 2. Я пробовал с и без. Теперь я их удалил. 3. Да, у меня действительно есть этот смысл. Не уверен, почему я не поместил его в раздел кода Все еще 404
2. Хм, я воссоздал решение barebones, используя ваш код, и смог получить ожидаемый результат от этой конечной точки. Я обновлю свой ответ полным кодом, чтобы вы могли увидеть, выделяется ли что-нибудь.
3. @zebabasu Я обновил свой ответ. Но, глядя на структуру вашего проекта, кажется, что вам не хватает приложения. Ты это сделал
manage.py startapp app_name
? Представления/модели/и т.д. Должны находиться в папке приложения, а не в папке вашего проекта.4. Я снова переделал свой проект, и это сработало ! Спасибо
5. @zeba basu отметьте этот ответ как принятый.