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

时间:2018-09-10 13:39:43

标签: python django django-rest-framework

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

以下哪个或其他方法更适合DRF?

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

1 个答案:

答案 0 :(得分:1)

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

让我们看一下这个sample 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())


案例-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)

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


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)



结论

DRF具有足够的 灵活性 ,可以获取所需的输出格式以及将数据带入系统中。简而言之,这完全取决于您的 要求