Может ли кто-нибудь проверить, что не так с моим кодом в Django?

Итак, я только что создал CRUD в Django и теперь хочу протестировать его, и тест Create и Delete работает с этими командами в cmd:

CREATE

curl -X POST http://localhost:8000/user/ -H "Content-Type: application/json" -d "{\"username\": \"john_doe\", \"email\": \"john@example.com\", \"first_name\": \"John\", \"last_name\": \"Doe\"}"

DELETE

curl -X DELETE http://localhost:8000/user/john_doe/

Но проблема заключается в том, что когда я пробую следующее:

GET

curl -X GET http://localhost:8000/user/john_doe/

PUT

curl -X PUT http://localhost:8000/user/john_doe/ -H "Content-Type: application/json" -d "{\"email\": \"john.new@example.com\"}"

Я получаю огромную ошибку.

Для начала вот мой код views.py:

import json
import pymongo
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

client = pymongo.MongoClient('mongodb://localhost:27017/')

database = client['PoseTrack_Database']
users = database['users']


@csrf_exempt
def create_user(request):
    if request.method == 'POST':
        user_data = json.loads(request.body)
        users.insert_one(user_data)
        return JsonResponse({'status': 'success', 'message': 'User created successfully!'}, status=201)


@csrf_exempt
def delete_user(request, username):
    if request.method == 'DELETE':
        users.delete_one({'username': username})
        return JsonResponse({'status': 'success', 'message': 'User deleted successfully!'}, status=200)


@csrf_exempt
def view_user(request, username):
    if request.method == 'GET':
        data = users.find_one({'username': username})
        return JsonResponse(data)


@csrf_exempt
def update_user(request, username):
    if request.method == 'PUT':
        new_data = json.loads(request.body)
        users.update_one(username, {'$set': new_data})

А это мой urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('user/', views.create_user),
    path('user/<username>/', views.delete_user),
    path('user/<username>/', views.view_user),
    path('user/<username>/', views.update_user),

]

Так что я пробовал менять что-то в командах или пытался поместить ловцов ошибок в программу, но это не очень помогло для такого маленького CRUD. Я хотел бы, чтобы кто-нибудь либо сказал мне, что не так в моем коде, либо показал мне правильную команду, которую нужно выполнить в cmd для тестирования. Заранее спасибо!

Django просматривает каждый шаблон URL по порядку и останавливается на первом, который соответствует запрашиваемому URL, сопоставляя с HttpRequest.path_info.

В вашем случае сопоставляется только первый маршрут; 'user/<username>/' и единственный метод, который обрабатывает вызванное view обрабатывает 'DELETE', поэтому все остальные методы игнорируются.

This means that the 'GET' and 'PUT' requests you sent as seen above will be completely ignored. [1]

Полное игнорирование HttpRequest в представлении в Django недопустимо. Каждое представление должно возвращать HttpResponse.


Одним из возможных решений является использование представления на основе класса. Он будет правильно отправлять запросы к зарегистрированным представлениям, используя один маршрут, и обрабатывать неподдерживаемые методы, возвращая для них HttpResponseNotAllowed.

@method_decorator(csrf_exempt, name="dispatch")
class User(View):

    def post(self, request):
        user_data = json.loads(request.body)
        users.insert_one(user_data)
        return JsonResponse({'status': 'success', 'message': 'User created successfully!'}, status=201)

    def delete(self, request):
        users.delete_one({'username': self.kwargs['username']})
        return JsonResponse({'status': 'success', 'message': 'User deleted successfully!'}, status=200)

    def get(self, request):
        data = users.find_one({'username': self.kwargs['username']})
        return JsonResponse(data)

    def put(self, request):
        new_data = json.loads(request.body)
        users.update_one(self.kwargs['username'], {'$set': new_data})
        return JsonResponse({'status': 'success', 'message': 'User updated successfully!'}, status=200)
urlpatterns = [
    path('user/<username>', views.User.as_view(), name="user"),
]

[1] By "completely" I mean completely. Not even a HttpResponseNotAllowed is sent to the client.

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