Получение функции post() из функции представления, возвращаемой resolve()

Я определил класс на основе rest_framework.views.APIView и добавил его как представление к некоторому url. Например, так:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.urls import path

class MyApi(APIView):

    def post(self, request):
        # Do something with the request
        print(request.data)
        return Response(status=200)


path('my-url', MyApi.as_view())

В другом файле я хочу получить доступ к функции post() этого класса, но я знаю только url. Поэтому я использую функцию django.urls.resolve(), чтобы получить функцию представления.

from django.urls import resolve
view, args, kwargs = resolve(url)

Однако я хочу получить не функцию представления, а базовую функцию post(), которую я определил в API-классе.

Есть ли возможность получить эту функцию, зная только url?

Я хочу избежать построения поиска для каждого возможного url.

rest_framework.views.APIView вызывает один из своих методов на основе метода запросов. поэтому функция не может быть получена только из URL запроса. ей нужен и URL и запрос method. например, если вы посылаете запрос POST на example/, он вызывает метод post вашего APIView. а если вы вызываете тот же URL с помощью метода GET, он вызывает метод get вашего представления.

из rest_framework.views.APIView исходного кода :

# Get the appropriate handler method
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)

поэтому мы можем сделать то же самое.

сначала получите представление из функции resolve:

from django.urls import resolve
view, args, kwargs = resolve(request.URL)

затем, получите функцию обработчика из представления:

if request.method.lower() in view.http_method_names:
    handler = getattr(view, request.method.lower(),None)
else:
    handler = None
Вернуться на верх