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
相关产品推荐
相关产品推荐

