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

Vue向Django API发起并发请求时均返回最后请求响应的问题

解决Vue并发请求Django API返回相同响应的问题

看起来你遇到了并发请求时响应被意外覆盖的问题,我帮你分析下可能的原因和解决办法:

首先排查后端Django视图的问题

最常见的元凶是Django QuerySet的惰性求值缓存。如果你的视图里把查询集定义在了函数外部,就会出现这种复用缓存的情况:

# 错误示例:查询集定义在函数外,会被缓存复用
all_users = User.objects.all()
new_users = User.objects.filter(is_new=True)

def list_objects(request):
    if 'type' in request.GET and request.GET['type'] == 'new':
        return Response(new_users.values())
    else:
        return Response(all_users.values())

QuerySet是惰性执行的,第一次查询后结果会被缓存,后续请求直接复用缓存数据,并发请求时自然会拿到相同结果。

解决办法:把查询逻辑放到视图函数内部,确保每次请求都重新执行查询:

def list_objects(request):
    if 'type' in request.GET and request.GET['type'] == 'new':
        # 每次请求都重新查询新用户
        new_users = User.objects.filter(is_new=True).values()
        return Response(new_users)
    else:
        # 每次请求都重新查询全部用户
        all_users = User.objects.all().values()
        return Response(all_users)

另外,建议给响应添加禁用缓存的头,避免浏览器或中间件干扰:

from rest_framework.response import Response

def list_objects(request):
    # 你的查询逻辑...
    response_data = ...
    
    response = Response(response_data)
    # 禁用缓存的响应头配置
    response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response['Pragma'] = 'no-cache'
    response['Expires'] = '0'
    return response

然后检查前端Vue的问题

1. 修正变量名冲突

你在new_users()方法里给this.new_users赋值,但方法名和数据变量名完全相同——虽然Vue的方法和数据是分开存储的,但这种命名很容易引发混淆,建议改成驼峰命名规范:

data() {
  return {
    sers: [],
    newUsers: [] // 数据变量改为驼峰
  }
},
methods:{
  fetchUsers(){ // 方法名调整,和变量名区分开
    axios.get('users').then((response) => {
      this.sers = response.data;
    }).catch((error) => {
      console.log(error);
    });
  },
  fetchNewUsers(){ // 方法名重新命名
    axios.get('users', {
      params: {type:'new'},
    }).then((response) => {
      this.newUsers = response.data;
    }).catch((error) => {
      console.log(error);
    });
  }
},
mounted(){
  this.fetchUsers();
  this.fetchNewUsers();
}

2. 禁用axios请求缓存

浏览器默认会缓存GET请求,即使带参数的URL不同,也可能出现缓存问题。可以在axios请求中明确禁用缓存:

axios.get('users', {
  params: {type:'new'},
  cache: false // 强制禁用缓存
})

关键排查步骤:确认请求的实际响应

打开浏览器开发者工具(F12),切换到「Network」标签:

  • 确认两个请求的URL分别是/users和/users?type=new
  • 查看每个请求的「Response」内容,确认Django是否返回了正确的数据
    如果Response内容是正确的,那问题就在前端赋值逻辑;如果Response内容错误,就回到后端视图继续排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:17:55