Python/Docker - удаление метода не разрешено Django
Я пытаюсь запустить программу с помощью docker, которая позволит мне уничтожать запросы с помощью программы PostMan. Для этого я создал класс ProductViewSet, который позволит мне удалить запрос. Но когда я запускаю docker-compose в терминале Visual Studio и пытаюсь запустить запрос DELETE через PostMan, он выдает мне ошибку в PostMan, которая говорит "detail": method "DELETE" not allowed. Я пытался использовать функцию @action, чтобы попытаться связать функцию destroy из моего views.py с моим urls.py в той же папке, используя этот ответ Метод Delete Not Allowed - destroy() метод Django, я также пытался просто использовать мою главную функцию Product и использовать маршрутизатор, как показано в этом ответе "detail": "метод \delete\ не разрешен" django, но оба этих ответа не помогают мне вообще.
Вот моя ошибка, которую я получаю в PostMan и в терминале Visual Studio:
Почтальон:
{
"detail": "Method \"DELETE\" not allowed."
}
Visual Studio Terminal:
backend_1 | 172.19.0.1 - - [16/Mar/2022 00:58:14] "DELETE /api/products HTTP/1.1" 405 -
Вот мои файлы requirements.txt, Dockerfile, docker-compose.yml и views.py соответственно:
requirements.txt:
Django==3.1.3
djangorestframework==3.12.2
mysqlclient==2.0.1
django-mysql==3.9
django-cors-headers==3.5.0
pika==1.1.0
Dockerfile:
FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . /app
docker-compose.yml:
version: '3.8'
services:
backend:
build:
context: .
dockerfile: Dockerfile
command: 'python manage.py runserver 0.0.0.0:8000'
ports:
- 8020:8000
volumes:
- .:/app
depends_on:
- db
queue:
build:
context: .
dockerfile: Dockerfile
command: 'python -u consumer.py'
depends_on:
- db
db:
image: mysql:5.7.22
restart: always
environment:
MYSQL_DATABASE: veganettest
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ROOT_PASSWORD: root
volumes:
- .dbdata:/var/lib/mysql
ports:
- 33070:3306
файлviews.py:
#**************************************************
# VEGA Copyright (C) Tetra System Solutions 2022
#
# Author: Trevor R. Blanchard
#
#**************************************************
# imports that will allow us to use the django rest framework with our project
# and will allow us to use our Product, and User classes to create our viewset.
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import action
from .models import Product, User
from .producer import publish
from .serializers import ProductSerializer
import random
# Here is where our view set is defined.
class ProductViewSet(viewsets.ViewSet):
# lists all queries available on PostMan
def list(self, request):
products = Product.objects.all()
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
# creates a query that we can interact with
def create(self, request):
serializer = ProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
publish('product_created', serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED)
# retreives a query from our list
def retrieve(self, request, pk=None):
product = Product.objects.get(id=pk)
serializer = ProductSerializer(product)
return Response(serializer.data)
# updates the list of queries
def update(self, request, pk=None):
product = Product.objects.get(id=pk)
serializer = ProductSerializer(instance=product, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
publish('product_updated', serializer.data)
return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
# deletes a query
def destroy(self, request, pk=None): # this function is involved with the Method delete not allowed error.
product = Product.objects.get(id=pk)
product.delete()
publish('product_created', pk)
return Response(status=status.HTTP_204_NO_CONTENT)
# creates a view for the user so he/she can view the product.
class UserAPIView(APIView):
def get(self, _):
users = User.objects.all()
user = random.choice(users)
return Response({
'id': user.id
})
Что именно я могу сделать, чтобы исправить этот код? Спасибо!
В этом запросе:
backend_1 | 172.19.0.1 - - [16/Mar/2022 00:58:14] "DELETE /api/products HTTP/1.1" 405 -
Ваш запрос не содержит первичного ключа. Это означает, что он будет соответствовать этой записи в вашем URLconf:
path('profiles', ProductViewSet.as_view({
'get': 'list',
'post': 'create'
})),
Здесь нет действия для DELETE. У вас есть действие, определенное для удаления здесь:
path('profiles/<str:pk>', ProductViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
Но этот URL требует первичного ключа. Вам нужно либо изменить URL, на который вы отправляете запрос DELETE, либо добавить метод удаления к первой записи в URLconf.