Преобразуйте rest_framework.response.Response в requests.models.Response - PullRequest
0 голосов
/ 26 мая 2020

Наши микросервисы настроены, как показано в приведенном ниже примере.

# 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.

Кроме того, есть ли другой лучший способ решить мою проблему, кроме того, который я пытаюсь сделать?

...