对于 Django 中的 CRUD,
POST
和 DELETE
测试正在运行:
curl -X POST http://localhost:8000/user/ -H "Content-Type: application/json" -d "{\"username\": \"john_doe\", \"email\": \"[email protected]\", \"first_name\": \"John\", \"last_name\": \"Doe\"}"
curl -X DELETE http://localhost:8000/user/john_doe/
但是对于这些:
curl -X GET http://localhost:8000/user/john_doe/
curl -X PUT http://localhost:8000/user/john_doe/ -H "Content-Type: application/json" -d "{\"email\": \"[email protected]\"}"
我收到错误。
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),
]
测试的正确命令是什么?
Django 按顺序运行每个 URL 模式,并停在与请求的 URL 匹配的第一个,与
HttpRequest.path_info
匹配。
就您而言,只有第一条路线;
'user/<username>/'
是匹配的并且是调用的唯一方法
视图句柄是 'DELETE'
因此 所有其他方法都被忽略。
这意味着您发送的如上所示的
'GET'
和'PUT'
请求将被完全忽略。 [1]
Django 中不允许完全忽略 Django 视图中的
HttpRequest
。每个视图都必须返回 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] 我所说的“完全”是指完全。甚至连
HttpResponseNotAllowed
都没有发送给客户端。