You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django APIView中调用getattr获取http_method_names为何返回全部HTTP方法(仅实现GET方法)

Django APIView中调用getattr获取http_method_names为何返回全部HTTP方法(仅实现GET方法)

这个问题我之前也碰到过,其实核心是对http_method_names这个属性的作用理解有偏差哦~

首先,http_method_names是APIView的父类(也就是Django原生的View类)自带的类属性,它的默认值就是包含所有常用HTTP方法的列表:['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']。这个属性的作用是定义视图允许接收的HTTP方法范围,而不是自动检测你实际实现了哪些方法。

也就是说,哪怕你只写了get方法,只要没主动修改http_method_names,它就会一直沿用父类的默认值,所以用getattr获取到的自然是全部方法。

如果想要让视图只允许GET方法,你只需要在自己的视图类里重写这个属性就行啦,比如:

class MyView(APIView):
    # 重写http_method_names,只保留GET
    http_method_names = ['get']

    def get(self, request, id):
        # do something

这样再调用getattr(MyView(), "http_method_names", []),返回的就只有['get']了。

另外补充个小知识点:如果你用函数视图的话,可以用@api_view(['GET'])装饰器来限制允许的方法,但对于类视图的APIView,重写http_method_names是更直接的方式哦~

备注:内容来源于stack exchange,提问作者Labeeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:54:27