Получение функции 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