Django Rest 框架:支持任意 HTTP 动词的视图?
Posted
技术标签:
【中文标题】Django Rest 框架:支持任意 HTTP 动词的视图?【英文标题】:Django Rest Framework: View That Supports Arbitrary HTTP verbs? 【发布时间】:2020-02-09 10:20:01 【问题描述】:是否有一种视图类型,例如允许我两者兼有:
获取/account/items
和
POST / PATCH account/items/<pk>/
一口气?从一个视图集还是什么?请注意,我没有在 POST 上的 account/items
路由上创建任何东西——但我需要 POST 到 account/items/<pk>
以执行特定操作
据我所知,我需要创建两个单独的视图,一个用于通过GET /account/items
获取列表,另一个用于在详细视图上执行自定义 POST 和 PATCH 操作。对吗?
【问题讨论】:
视图集不就是这样工作的吗?也许我不明白你的问题,但看看@action 装饰器:django-rest-framework.org/api-guide/viewsets/…,你可以设置“detail”变量,如果它使用列表或详细信息 url 来处理。 是的,我看到了——看起来我无法使用它获得我想要的确切 url 方案。 @action 装饰器将函数名称作为 url 路径的下一部分,但我希望它是 pk。另一方面,Viewset 中的常规详细视图似乎不允许我像在详细路由上那样覆盖 POST(我需要从路径中获取 pk)。 【参考方案1】:您应该使用 DRF 的 class-based views。
使用 APIView 类与使用常规 View 类几乎相同,像往常一样,传入的请求被分派到适当的处理程序方法,例如 .get() 或 .post()。
这是一个带有 get
和 post
处理程序的示例。我已将用于更新用户的代码抽象为一个帮助方法供您创建 - 您的实现会有所不同:
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth.models import User
from my_project.accounts.helpers import update_user
class UserView(APIView):
def get(self, request, *args, **kwargs):
"""
Return a user.
"""
user_data = User.objects.get(pk=kwargs['pk']).values()
return Response(user_data)
def patch(self, request, *args, **kwargs):
user = User.objects.get(pk=kwargs['pk'])
data = request.POST
update_user(user, data)
return Response('Updated user!')
您可能还想查看ViewSets,它提供了简单的 CRUD 操作处理。
【讨论】:
所以我现在正在使用 APIView——我知道这涵盖了 GETaccount/items
的情况,但是上面示例中的 POST
似乎没有涵盖发布到 account/items/<PK>
执行操作。
该特定 APIView 示例(来自文档)用于列表视图,但您可以将任何 url 指向任何 APIView。您可以创建一个User
视图,该视图在其get
方法中返回一个用户,在其post
方法中创建一个用户,并在其patch
方法中更新一个用户。就像在任何其他视图中一样执行此操作。如果有帮助,我可以用一个例子更新我的答案。
我继续修改我的答案。现在让我知道这是否有意义。以上是关于Django Rest 框架:支持任意 HTTP 动词的视图?的主要内容,如果未能解决你的问题,请参考以下文章
Django REST FRAMEWORK swagger框架详解
django rest框架在nginx后面但不直接给出403
Django REST 框架 http 404 详细信息”:“未找到。”