Почему функция _allowed_methods() в django APIView возвращает все http-методы, хотя реализован только GET?

У меня есть представление, наследуемое от APIView, и я реализовал в нем только метод GET.

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

Но когда я вызываю ClassInstance._allowed_methods(), я получаю список всех методов HTTP, даже если они не реализованы. Есть ли способ получить только те методы, которые действительно разрешены в данном классе?

Атрибут .http_method_names [Django-doc] - это атрибут, который по умолчанию перечисляет все методы HTTP, так:

["get", "post", "put", "patch", "delete", "head", "options", "trace"]

Обычно он всегда будет возвращать этот список, если только вы не переопределите его. Это может быть полезно, если вы наследуете от представления, которое, например, определило .post(…) метод, но вы не хотите его раскрывать, например:

class MyView(SomethingWithPostMethodView):
    http_method_names = ['get', 'head', 'options']

    def get(self, request, id):
        # …
        pass

Или вы можете, технически говоря, расширить список http_method_names с помощью пользовательского метода, хотя я бы настоятельно рекомендовал этого не делать.

Для того чтобы узнать, какие методы реализует представление, можно использовать _allowed_methods(…), который таким образом проверяет, разрешен ли соответствующий метод .get(…) или нет.

Таким образом, вы не можете проанализировать методы, разрешенные с:

getattr(ClassInstance, "http_method_names", [])

Вы можете просто создать экземпляр и работать с _allowed_methods():

ClassInstance()._allowed_method()

If ClassInstance, таким образом, является ссылкой на сам тип, или используйте ClassInstance._allowed_method(), если он уже является видом объекта.

Вернуться на верх