Может ли кто-нибудь проверить, что не так с моим кодом в 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.