gpt4 book ai didi

python - Django Rest Framework : One URL for POST, 同一 APIView 上的 GET 的一个 URL

转载 作者:行者123 更新时间:2023-12-01 01:56:28 24 4
gpt4 key购买 nike

我当前正在编写一个 POST 请求来创建 A 记录:

client.post(url, {'name' : 'foo', 'another_field' : 2})

在服务器端,在 View 上,我有:

class AQuery(generics.GenericAPIView):
queryset = A.objects.all()
serializer_class = ASerializer

def get(self, request, param1, param2, format=None):
... # do some special query based off of param1 and 2.

def post(self, request, format=None):
serializer = self.get_serializer(data=request.data, many=False)
if serializer.is_valid():
serializer.save()
return Response(...)
return Response(...)

如您所见,我希望在 url 中捕获 param1param2,因此在 urls.py 中:

urlpatterns = [
# for GET
path('A/<str:param1>/<path:param2>', views.AQuery.as_view(), name='A query GET')
# for POST
path('A', views.AQuery.as_view(), name='A query POST')
...
]

显然,我可以将 param1param2 添加到 post 函数 def,但它们就在那里 em>,没有任何目的。对我来说,这似乎是糟糕的代码味道。

我如何实现这样的事情,并明确禁止客户端向 A/param1/param2 发出 POST 请求,并明确禁止客户端向 A 发出 GET 请求/

我尝试过的

我尝试将 View 转换为viewsets.ModelViewSet,并添加了以下内容:

a_get_query = AQuery.as_view({'get':'get'})
a_post_query = AQuery.as_view({'post':'post'})

在我的urls.py中:

urlpatterns = [
# for GET
path('A/<str:param1>/<path:param2>', views.a_get_query, name='A query GET')
# for POST
path('A', views.a_post_query, name='A query POST')
...
]

但我收到以下错误:

TypeError: The actions argument must be provided when calling .as_view() on a ViewSet. For example .as_view({'get': 'list'})

而且我不太确定它发生在哪里。

最佳答案

这种方法对我来说效果符合预期。然而,我必须做一些小的改变:

1) 我必须将函数名称从 getpost 更改为 do_getdo_post 。当函数的名称与 HTTP 方法本身相同时,Django 似乎做了一些特别的事情。

2) 我直接在 urls.py 中内联调用 as_view()

这样做之后:

urlpatterns = [
# for GET
path('A/<str:param1>/<path:param2>', views.AQuery.as_view({'get':'do_get'}), name='A query GET')
# for POST
path('A', views.AQuery.as_view({'post':'do_post'}), name='A query POST')
...
]

结果:

GET   A/param1/param2  -> 200 OK
GET A/ -> 405 Method Not Allowed

POST A/param1/param2 -> 405 Method Not Allowed
POST A/ -> 200 OK

关于python - Django Rest Framework : One URL for POST, 同一 APIView 上的 GET 的一个 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50123599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com