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.

Вернуться на верх