如何响应 Django 基于类的视图中不允许的方法

Posted

技术标签:

【中文标题】如何响应 Django 基于类的视图中不允许的方法【英文标题】:How to respond to method not allowed in Django class-based views 【发布时间】:2021-07-25 06:12:49 【问题描述】:

我有一个 Django 应用程序,其中的视图是使用 Django 的通用视图(预先固定,不能从 Django REST 框架更改为 APIView)编写的。每个 API 要么响应 POST、PUT 或 GET 请求。现在我想为每个 API 响应其他请求类型(DELETE、GET...等)的自定义消息。目前,Django 在没有任何响应正文的情况下发送其默认的 405 错误。我该如何改变呢?这是一个默认类

class ClassName(View):
    
    def post(self, request) -> JsonResponse:
        ......
        some other application logic
        ......
        
        return JsonResponse(
            "status": True,
            "message": "",
        , status=200)

现在,这个类只能成功回复 POST 请求,不允许任何其他方法。对于其他请求类型,我该如何响应以下消息?

return JsonResponse(
     "status": false,
      "msg": "method not allowed",
     , status=405)

【问题讨论】:

【参考方案1】:

正如 Django 文档所说:

在其核心,基于类的视图允许您响应不同的 具有不同类实例方法的 HTTP 请求方法,而不是 在单个视图函数内有条件地分支代码。 查看更多here。

因此,要处理 GET 请求,请将 get 方法添加到基于类的视图中,如下所示:

class ClassName(View):
    #......
    #some other request handlers
    #......
    
    def get(self, request) -> JsonResponse:
        #......
        #some other application logic
        #......
        
        return JsonResponse(
            "status": True,
            "message": "",
        , status=200)

【讨论】:

是的,我知道。我想开枪是一条捷径。我不想为每个函数编写每种类型的请求类型。 如果是这样,您可以使用基于函数的视图,或者如果必须使用基于类的视图,那么您可以覆盖 dispatch() 方法并将其路由到您的单个处理程序方法。查看更多here

以上是关于如何响应 Django 基于类的视图中不允许的方法的主要内容,如果未能解决你的问题,请参考以下文章

将基于缓存 Django 类的视图响应与请求中的参数绑定

django的几种方法进行序列化(视图)

如何在基于类的视图中使用LoginRequiredMixin来发送一个django错误信息?

Django编写RESTful API:基于类的视图

Django 之 Views视图理解

基于 Django 类的视图和通用视图详细信息使用