Наши микросервисы настроены, как показано в приведенном ниже примере.
# microservices.py
from rest_framework.views import APIView
from rest_framework.response import Response
class MicroServiceView(APIView):
# View registered to /microservice-api/
def post(self, request):
response_data = {
"status": "success"
}
return Response(response_data)
# microservice_interface.py
import requests
def get_response_for_microservice():
return requests.get("https://server.domain.com/microservice-api/")
# main_view.py
from rest_framework.views import APIView
from rest_framework.response import Response
from microservice_interface import get_response_for_microservice
class mainView(APIView):
def post(self, request):
service_response = get_response_for_microservice()
response_json = response.json()
return Response(response_json)
В настоящее время наш основной сервер и сервер микросервисов одинаковы. Поэтому, чтобы уменьшить накладные расходы на сеть, я хочу изменить интерфейс микросервиса, чтобы он напрямую вызывал представление микросервиса. Как я могу этого добиться?
Когда я попробовал
# microservice_interface.py
from microservices import MicroServiceView
def get_response_for_microservice(original_request):
return MicroServiceView.as_view(original_request)
, я получил сообщение об ошибке:
AssertionError: аргумент request
должен быть экземпляром django.http.HttpRequest
, а не rest_framework.request.Request
.
Поэтому я немного изменил код.
# microservice_interface.py
from microservices import MicroServiceView
def get_request_for_microservice(original_request):
microservice_request = HttpRequest()
microservice_request.method = original_request.method
microservice_request.META = original_request.META
microservice_request.POST.update(dict(original_request.POST))
microservice_request.GET.update(dict(original_request.GET))
return microservice_request
def get_response_for_microservice(original_request):
microservice_request = get_request_for_microservice(original_request)
return MicroServiceView.as_view(microservice_request)
После этого я столкнулся с другой проблемой. В mainView я получил ошибку
AttributeError: объект 'Response' не имеет атрибута 'json'
При исследовании я обнаружил, что MicroServiceView.as_view(microservice_request)
возвращает экземпляр rest_framework.response.Response
, где as requests.get("https://server.domain.com/microservice-api/")
возвращает экземпляр requests.models.Response
Как я могу преобразовать экземпляр rest_framework.response.Response
в экземпляр requests.models.Response
?
У меня нет права изменять mainView.
Кроме того, есть ли другой лучший способ решить мою проблему, кроме того, который я пытаюсь сделать?