我有一个端点,需要向第三方API发出请求以获取项目列表并将结果返回给客户端。
以下哪个或其他方法更适合DRF?
答案 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 :如果您不需要完整的数据,而只需要很少的部分(id
和body
)
在这种特殊情况下,您可以使用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具有足够的 灵活性 ,可以获取所需的输出格式以及将数据带入系统中。简而言之,这完全取决于您的 要求