我的 GET 和 PUT 测试命令有什么问题?

问题描述 投票:0回答:1

对于 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),
]

测试的正确命令是什么?

python django database curl backend
1个回答
0
投票

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
都没有发送给客户端。

© www.soinside.com 2019 - 2024. All rights reserved.