Ozg*_*ali 3 python django django-rest-framework
我有一个端点,我需要向第三方 API 发出请求以获取项目列表并将结果返回给客户端。
以下哪种方法或任何其他方法更适合 DRF?
由于您的问题没有提及将数据写入 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())
案例 - 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足够灵活,可以获取所需的输出格式并将数据引入系统。简而言之,这一切都取决于您的要求
| 归档时间: | 
 | 
| 查看次数: | 1642 次 | 
| 最近记录: |