Py学习  »  Django

如何在Django REST框架中正确设置HTTPƕu METHOD|u NOT|u ALLOWED状态代码的Allow头

Wind Up Lord Vexxos • 5 年前 • 2157 次点击  

我目前正在寻找一个API端点禁用某些方法-作为增加的安全性。我正在使用DRF建议使用的状态码,这是我的情况下的状态码 HTTP_405_METHOD_NOT_ALLOWED “-不过,在我看来,虽然这是可行的,但头文件仍然显示该方法在Allow中。见以下截图:

HTTP_405_METHOD_NOT_ALLOWED Django Rest Framework example

如您所见,我正在执行一个GET请求-但是Allow头说它很好-即使状态代码被正确应用。

剥离后的示例代码:

class TokenValidateView(APIView):
    def get(self, request, format=None):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED, headers=?)

我想我需要在headers字典中设置一些内容(我已经添加了 ? 我不太确定需要做什么)作为Response()函数中的参数之一,但我不确定这是否是DRF本身的错误?当然,当状态代码被传递时,应该在头中相应地设置它?

N、 B.我也试过添加 headers = { 'Allow': 'POST' } Response() 争论,但那似乎不起作用。。。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51995
文章 [ 3 ]  |  最新文章 5 年前
Sam
Reply   •   1 楼
Sam    6 年前

如果不需要这个方法,就不要在视图上实现它,视图是ApiView的子类。它将自动发送方法不允许的响应。

zeynel
Reply   •   2 楼
zeynel    6 年前

当您覆盖 get 方法的观点, GET 自动添加到 Allow 由django rest framework生成的头,不管您返回什么响应。你可以简单地删除 得到 方法,如果希望它返回 405 Not Allowed .

如果出于某种原因,你想 得到 方法,不包括 得到 进入 允许 头,你可以覆盖 allowed_methods 您认为的属性:

@property
def allowed_methods(self):
    allowed_methods = super().allowed_methods
    allowed_methods.remove('GET')
    return allowed_methods
JPG
Reply   •   3 楼
JPG    6 年前

因为你用的是 APIView 类,它将允许在视图类中定义的所有方法。DRF响应允许 HTTP GET 方法,因为您已在视图中定义了。


下面的视图类将允许 HTTP GET,HTTP POST,HTTP PATCH,HTTP PUT and HTTP DELETE

class TokenValidateView(APIView):
    def get(self, request, format=None):
        # something
        return Response("this is HTTP GET")

    def post(self, request, format=None):
        return Response("this is HTTP POST")

    def patch(self, request, format=None):
        return Response("this is HTTP PATCH")

    def put(self, request, format=None):
        return Response("this is HTTP PUT")

    def delete(self, request, format=None):
        return Response("this is HTTP DELETE")

如上所述,响应类检查 http方法 在视图类中, 不是他们的反应 .

所以,如果你想删除 HTTP获取 你的方法 允许的方法 ,只需移除 get() 视图类中的方法

class TokenValidateView(APIView):
    # remove the "get()" method
    def get(self, request, format=None):
        # something
        return Response("this is HTTP GET")

    def post(self, request, format=None):
        return Response("this is HTTP POST")

    def patch(self, request, format=None):
        return Response("this is HTTP PATCH")

    def put(self, request, format=None):
        return Response("this is HTTP PUT")

    def delete(self, request, format=None):
        return Response("this is HTTP DELETE")