You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向用户返回Django后台任务的FedEx API调用响应

方案建议:Django后台任务获取FedEx API响应的更优实现

存文件不是最优解,优先用数据库存储关联记录,即可解决任务执行后拿不到响应的问题:

  • 第一步:新增FedEx API请求专属模型,将业务字段和原始响应分开存储,参考模型定义:
# models.py 示例
from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone

User = get_user_model()

class FedexAPIRequest(models.Model):
    STATUS_CHOICES = [
        ('pending', '待执行'),
        ('success', '成功'),
        ('failed', '失败'),
    ]
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='fedex_requests')
    waybill_params = models.JSONField(verbose_name='运单请求参数')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    tracking_number = models.CharField(max_length=50, blank=True, verbose_name='运单号')
    error_code = models.CharField(max_length=50, blank=True, verbose_name='错误码')
    error_msg = models.CharField(max_length=200, blank=True, verbose_name='错误信息')
    raw_xml_response = models.TextField(blank=True, verbose_name='原始XML响应')
    created_at = models.DateTimeField(auto_now_add=True)
    completed_at = models.DateTimeField(null=True, blank=True)
  • 第二步:修改后台任务逻辑,任务执行时直接关联对应请求记录,完成后更新数据即可,参考调用逻辑:
# 后台任务定义
from background_task import background

@background(schedule=0)
def call_fedex_api(request_record_id):
    # 查询关联的请求记录
    request_record = FedexAPIRequest.objects.get(id=request_record_id)
    # 此处写调用FedEx API的业务逻辑,获取XML响应
    # 解析XML后更新request_record的状态、运单号、错误信息、原始响应等字段
    request_record.completed_at = timezone.now()
    request_record.save()

# 视图层触发任务的逻辑
new_request = FedexAPIRequest.objects.create(
    user=request.user,
    waybill_params=request.data # 前端传入的运单参数
)
call_fedex_api(new_request.id)
  • 可选轻量方案:如果不需要长期留存API响应,可以用Redis缓存存储结果,键命名规则为fedex_response_{user_id}_{request_id},设置30天过期时间即可,适合高并发场景。

用户端可以通过定时轮询接口、或者接入Websocket主动推送的方式,获取请求的最新状态和结果,完全不需要文件中转,检索和管理效率远高于存文件。


API响应处理通用最佳实践

是否需要给用户展示完整响应

分用户场景判断:

  • 普通C端用户:不需要展示完整响应,仅输出用户关心的核心业务信息即可:成功时展示运单号、预计送达时间、物流查询入口;失败时展示转化为大白话的错误提示(比如「收件地址不在FedEx服务范围内」),不要直接抛出错误码、原始XML内容,避免增加用户理解成本。
  • 平台管理员、B端商家用户:这类用户有自主排查问题、对接FedEx客服的需求,需要开放完整响应查看权限。

完整响应的最佳展示方式

如果需要向用户展示完整响应,遵循以下规则即可:

  • 核心信息前置:把运单号、错误码、错误提示这类高频查询的字段单独提取出来放在页面顶部高亮展示,不需要用户在原始响应里手动查找
  • 原始响应默认折叠:用页面折叠组件隐藏原始XML内容,用户有排查需求时再手动展开,避免占用过多页面空间
  • 自动格式化:原始XML要自动缩进格式化,不要直接展示压缩成一行的内容,同时提供一键复制按钮,方便用户快速提取内容
  • 可选下载入口:支持用户点击后动态生成XML/TXT文件下载,无需提前在服务器存储响应文件。

内容的提问来源于stack exchange,提问作者Tomer_Harari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:57:05