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()。

这是一个带有 getpost 处理程序的示例。我已将用于更新用户的代码抽象为一个帮助方法供您创建 - 您的实现会有所不同:

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——我知道这涵盖了 GET account/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 详细信息”:“未找到。”

Angular 4 对 Django Rest 框架的 HTTP 请求

django rest框架错误需要一个字段

Django REST框架--模式与客服端库