从第三方 api 返回项目列表的 DRF 方式是什么?

Ozg*_*ali 3 python django django-rest-framework

我有一个端点,我需要向第三方 API 发出请求以获取项目列表并将结果返回给客户端。

以下哪种方法或任何其他方法更适合 DRF?

  1. 进行输入参数验证并调用第三方API,在视图方法中,将响应中的项目列表传递给序列化程序进行序列化并将序列化程序数据返回给客户端
  2. 将请求参数作为只写字段传递给序列化器,在序列化器中进行字段验证、api调用和序列化
  3. 1和2的混合物;使用 2 个不同的序列化器,一个将请求参数作为只写字段,验证输入参数并向第 3 方 api 发出请求,另一个序列化器从第一个序列化器获取结果列表并将项目序列化以供客户端使用

JPG*_*JPG 6

由于您的问题没有提及将数据写入 DB 的任何内容,因此毫无疑问您可以使用 Method-1。

让我们看看这个示例 api,它返回一个项目列表(一个列表 api)。

案例 - 1:我们需要显示与我们从第三方 api 得到的响应相同的响应
在这种情况下,我们不需要任何序列化程序或序列化过程,我们只需要将数据从第三方 API 传递给客户端。

from rest_framework.decorators import api_view
from rest_framework.response import Response
import requests


@api_view()
def my_view(request):
    tp_api = "https://jsonplaceholder.typicode.com/posts"
    response = requests.get(tp_api)
    return Response(data=response.json())
Run Code Online (Sandbox Code Playgroud)


案例 - 2:如果您不需要完整的数据,但需要很少的部分(idbody
在这种特殊情况下,您可以使用 pythonic 循环或 DRF 序列化程序。

# using DRF serializer
from rest_framework import serializers


# serializer class
class Myserializer(serializers.Serializer):
    id = serializers.CharField()
    body = serializers.CharField()


@api_view()
def my_view(request):
    tp_api = "https://jsonplaceholder.typicode.com/posts"
    response_data = requests.get(tp_api).json()
    my_serializer = Myserializer(data=response_data, many=True)
    my_serializer.is_valid(True)
    return Response(data=my_serializer.data)
Run Code Online (Sandbox Code Playgroud)

#Python loop way
@api_view()
def my_view(request):
    tp_api = "https://jsonplaceholder.typicode.com/posts"
    response_data = requests.get(tp_api).json()
    data = [{"id": res['id'], "body": res['body']} for res in response_data]
    return Response(data=data)
Run Code Online (Sandbox Code Playgroud)


case-2 中,我建议使用 DRF 序列化器,它可以做很多事情,比如验证等


当进入您的第二个方法时,对输入数据进行 验证将取决于您的要求。正如您在评论中所说,您需要向第三方 api 提供一些输入。所以,在访问第三方api之前应该进行验证


# Validation example
class MyInputSerializer(serializers.Serializer):
    postId = serializers.IntegerField(max_value=10)


class MyOutputSerializer(serializers.Serializer):
    id = serializers.CharField()
    body = serializers.CharField()


@api_view()
def my_view(request):
    input = MyInputSerializer(data=request.GET)
    input.is_valid(True)
    tp_api = "https://jsonplaceholder.typicode.com/comments?postId={}".format(input.data['postId'])
    response_data = requests.get(tp_api).json()
    my_serializer = MyOutputSerializer(data=response_data, many=True)
    my_serializer.is_valid(True)
    return Response(data=my_serializer.data)
Run Code Online (Sandbox Code Playgroud)



结论

DRF足够灵活,可以获取所需的输出格式并将数据引入系统。简而言之,这一切都取决于您的要求