Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于外部API调用的可浏览Django REST API包装器_Python_Json_Django_Django Rest Framework_Python Requests - Fatal编程技术网

Python 用于外部API调用的可浏览Django REST API包装器

Python 用于外部API调用的可浏览Django REST API包装器,python,json,django,django-rest-framework,python-requests,Python,Json,Django,Django Rest Framework,Python Requests,我正在为Django项目构建一个RESTful接口,我需要利用外部API,允许客户端和前端只引用一个Django API,而不需要外部API的详细信息 因此,我希望外部API数据像我自己基于视图的API一样返回到可浏览的API页面 如何将外部API的JSON响应序列化到可浏览的API网页呈现程序 例如,我希望mysite.fake/thing/details返回与externalapi.fake/thing/details返回的JSON相同的JSON,如下所示: {"thing_id&

我正在为Django项目构建一个RESTful接口,我需要利用外部API,允许客户端和前端只引用一个Django API,而不需要外部API的详细信息

因此,我希望外部API数据像我自己基于视图的API一样返回到可浏览的API页面

如何将外部API的JSON响应序列化到可浏览的API网页呈现程序

例如,我希望mysite.fake/thing/details返回与externalapi.fake/thing/details返回的JSON相同的JSON,如下所示:

{"thing_id": "900404", "description": "Thing description", "value": "100.00", "location": "Bin 401"}
并将其显示在可浏览的DRF API中

目前,我正在使用:

@api_view(('GET',))
@renderer_classes((JSONRenderer,))
def thing_finder(request, thing_id):
    """
    Get the current location for a thing
    http://localhost:8000/thing/find/9900404
    :param request: HTTP Request object
    :param thing_id: String - the thing ID
    :return: JSON - The Thing location JSON
    """
    a, b = THING_API_AUTH
    if request.method == 'GET':
        payload = {'thing_id': thing_id}
        r = requests.get(THING_API_AUTH, auth=HTTPBasicAuth(a, b), params=payload)
        if r.status_code == 200:
            data = json.loads(r.text)
            serializer = ThingFinderSerializer(data)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response({"error": "Request failed"}, status=r.status_code)
在settings.py中,我包括:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ]
}

我认为这是可行的,但它不能将结果格式化为可浏览的API。相反,我得到了一个未格式化的页面,页面中转储了JSON。我是否缺少模板要求?浏览器中的URL错误?settings.py中的BrowsableapInderer是否不足以默认呈现为可浏览API?TIA.

这里不需要使用序列化程序作为返回JSON数据的外部源。您可以使用response.json方法,如下所示

@api_view(('GET',))
@renderer_classes((JSONRenderer,))
def thing_finder(request, thing_id):
    a, b = THING_API_AUTH
    if request.method == 'GET':
        payload = {
            'thing_id': thing_id
        }
        response = requests.get(
            THING_API_AUTH,
            auth=HTTPBasicAuth(a, b),
            params=payload
        )
        if response.status_code == 200:
            return Response(response.json(), status=status.HTTP_200_OK)
        return Response({"error": "Request failed"}, status=response.status_code)

这里不需要使用序列化程序,因为它是返回JSON数据的外部源。您可以使用response.json方法,如下所示

@api_view(('GET',))
@renderer_classes((JSONRenderer,))
def thing_finder(request, thing_id):
    a, b = THING_API_AUTH
    if request.method == 'GET':
        payload = {
            'thing_id': thing_id
        }
        response = requests.get(
            THING_API_AUTH,
            auth=HTTPBasicAuth(a, b),
            params=payload
        )
        if response.status_code == 200:
            return Response(response.json(), status=status.HTTP_200_OK)
        return Response({"error": "Request failed"}, status=response.status_code)
我解决了它:

from rest_framework.renderers import JSONRenderer, BrowsableAPIRendererenter
@api_view(('GET',))
@renderer_classes((JSONRenderer, BrowsableAPIRenderer))
def thing_finder(request, thing_id):
    """
    Get the current location for a thing
    http://localhost:8000/thing/find/9900404
    :param request: HTTP Request object
    :param thing_id: String - the thing ID
    :return: JSON - The Thing location JSON
    """
    a, b = THING_API_AUTH
    if request.method == 'GET':
        payload = {'thing_id': thing_id}
        r = requests.get(THING_API_AUTH, auth=HTTPBasicAuth(a, b), params=payload)
        if r.status_code == 200:
            data = json.loads(r.text)
            serializer = ThingFinderSerializer(data)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response({"error": "Request failed"}, status=r.status_code)
这将在一个干净、格式化的页面中返回可浏览的API呈现。

我解决了它:

from rest_framework.renderers import JSONRenderer, BrowsableAPIRendererenter
@api_view(('GET',))
@renderer_classes((JSONRenderer, BrowsableAPIRenderer))
def thing_finder(request, thing_id):
    """
    Get the current location for a thing
    http://localhost:8000/thing/find/9900404
    :param request: HTTP Request object
    :param thing_id: String - the thing ID
    :return: JSON - The Thing location JSON
    """
    a, b = THING_API_AUTH
    if request.method == 'GET':
        payload = {'thing_id': thing_id}
        r = requests.get(THING_API_AUTH, auth=HTTPBasicAuth(a, b), params=payload)
        if r.status_code == 200:
            data = json.loads(r.text)
            serializer = ThingFinderSerializer(data)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response({"error": "Request failed"}, status=r.status_code)

这将在一个干净、格式化的页面中返回可浏览的API呈现。

我正在尝试在DRF可浏览的API中获取呈现响应-如果我使用您的方法,我将得到相同的未格式化页面,只返回原始JSON。但是,对于原始JSON来说,这是一个很好的提示。那么您希望的格式是什么呢?显示一些示例一个格式化的渲染,如下所示:我不明白有什么区别。也许添加一个屏幕截图或图像可以帮助我理解我解决了这个问题——我需要在JSONRenderer中加入BrowsableapInderer装饰器。谢谢,我正在尝试在DRF browsable API中获取要呈现的响应-如果我使用您的方法,我会得到相同的未设置样式的页面,只返回原始JSON。但是,对于原始JSON来说,这是一个很好的提示。那么您希望的格式是什么呢?显示一些示例一个格式化的渲染,如下所示:我不明白有什么区别。也许添加一个屏幕截图或图像可以帮助我理解我解决了这个问题——我需要在JSONRenderer中加入BrowsableapInderer装饰器。非常感谢。