如何在Django Rest Framework中调用外部API获取随机用户数据并存储
你不需要在这个场景下使用JavaScript的fetch方法对接DRF,整个流程全部在DRF服务端完成即可,前端只需要向你的DRF接口发送携带count参数的POST请求就可以。具体实现步骤如下:
步骤1:安装依赖
使用Python的requests库发送外部HTTP请求,执行安装命令:
pip install requests
步骤2:定义存储随机身份数据的模型
首先创建模型存储生成的身份数据,关联对应用户,方便后续GET请求查询:
# models.py from django.db import models from django.contrib.auth import get_user_model User = get_user_model() class RandomIdentity(models.Model): # 关联生成这条数据的登录用户 owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="generated_identities") gender = models.CharField(max_length=10) full_name = models.CharField(max_length=100) email = models.EmailField() phone = models.CharField(max_length=30) id_number = models.CharField(max_length=50, null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ["-created_at"]
创建完成后执行数据库迁移:
python manage.py makemigrations python manage.py migrate
步骤3:编写序列化器
分别编写入参校验和结果返回的序列化器:
# serializers.py from rest_framework import serializers from .models import RandomIdentity # 校验前端传入的生成数量参数 class GenerateCountSerializer(serializers.Serializer): count = serializers.IntegerField(min_value=1, max_value=5000) # 可根据randomuser.me的上限调整最大值 # 序列化返回身份数据 class RandomIdentitySerializer(serializers.ModelSerializer): class Meta: model = RandomIdentity fields = ["id", "gender", "full_name", "email", "phone", "id_number", "created_at"] read_only_fields = fields
步骤4:编写视图逻辑
核心逻辑在视图中实现,同时支持POST生成新数据、GET查询历史数据:
# views.py import requests from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework import status from .models import RandomIdentity from .serializers import GenerateCountSerializer, RandomIdentitySerializer class RandomIdentityView(APIView): # 仅允许已登录用户访问 permission_classes = [IsAuthenticated] def get(self, request): # 返回当前登录用户所有历史生成的身份数据 identities = RandomIdentity.objects.filter(owner=request.user) serializer = RandomIdentitySerializer(identities, many=True) return Response(serializer.data) def post(self, request): # 校验入参合法性 count_serializer = GenerateCountSerializer(data=request.data) count_serializer.is_valid(raise_exception=True) generate_count = count_serializer.validated_data["count"] # 请求randomuser.me接口获取原始数据 try: api_resp = requests.get( "https://randomuser.me/api/", params={"results": generate_count}, timeout=30 ) # 响应异常直接抛出错误 api_resp.raise_for_status() raw_user_list = api_resp.json()["results"] except requests.exceptions.RequestException: return Response( {"error": "获取随机身份数据失败,请稍后重试"}, status=status.HTTP_503_SERVICE_UNAVAILABLE ) # 批量构造数据对象并存库 identity_obj_list = [] for raw_user in raw_user_list: identity_obj_list.append(RandomIdentity( owner=request.user, gender=raw_user["gender"], full_name=f"{raw_user['name']['first']} {raw_user['name']['last']}", email=raw_user["email"], phone=raw_user["phone"], id_number=raw_user["id"]["value"] )) # 批量插入提升性能 RandomIdentity.objects.bulk_create(identity_obj_list) # 返回生成的结果 result_serializer = RandomIdentitySerializer(identity_obj_list, many=True) return Response(result_serializer.data, status=status.HTTP_201_CREATED)
步骤5:配置接口路由
将视图注册到项目路由中:
# urls.py from django.urls import path from .views import RandomIdentityView urlpatterns = [ path("identities/", RandomIdentityView.as_view(), name="random-identities"), ]
额外注意事项
- 可以根据业务需求调整
RandomIdentity的字段,randomuser.me返回的字段非常多,按需存储即可 - 建议给接口加请求频率限制,避免短时间内大量请求触发randomuser.me的限流规则
- 如果允许单次生成的数量很大,建议把请求外部API、存库的逻辑改成异步任务处理,避免接口超时
- 如果不需要重复生成相同数量的身份数据,可以增加缓存逻辑,减少不必要的外部请求
内容的提问来源于stack exchange,提问作者MartynaMajch
相关产品推荐
相关产品推荐

