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

Azure Web App 阻止Django应用并行AJAX请求排查求助

问题背景

基于Django 4.2.13 + Python 3.10的应用,在本地Linux环境及测试服务器(Linux + Nginx + Gunicorn)中,文件上传时通过AJAX请求展示处理进度的功能正常;但部署到Azure Web App后,主文件上传请求处理期间发起的并行AJAX进度查询请求始终处于Pending状态,服务器无相关日志记录,主请求完成后流程才恢复正常。

前端进度查询核心代码:

await sleep(400);
while (current_row < total_rows) {
  $.post('ppro_bar/get_progress_data', {'test': ''})
     .done(function(data) {
       if (typeof data.data != "undefined") {
         current_row = data.data.current_row;
         total_rows = data.data.total_rows;
         percent_progress = (current_row/total_rows)*100;
       
         progress_bar.innerHTML = `
           <div class="progress-bar progress-bar-striped
           progress-bar-animated" role="progressbar" style="width: 
           ${percent_progress}%" 
           aria-valuenow="${percent_progress}" 
           aria-valuemin="0" aria-valuemax="100"></div>`;
       }
     });
     await sleep(100);
}
解决思路

1. 解除Django会话独占锁

Django默认的数据库会话存储会对每个请求的会话记录加独占锁,直到请求结束。如果主文件上传请求长时间持有会话锁,后续AJAX请求会因等待锁释放而被阻塞。

  • 改用缓存会话存储(推荐):修改settings.py
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    # 搭配Azure Redis缓存的示例配置
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "your_azure_redis_connection_string",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    
  • 若必须使用数据库会话,设置SESSION_SAVE_EVERY_REQUEST = False,并确保主请求尽早完成会话操作后释放锁。

2. 调整Gunicorn Worker数量

Azure Web App部署Django时,若Gunicorn的worker数量过少(如默认1个),主请求会占用唯一worker,导致后续请求排队等待。

  • 修改Gunicorn启动命令,增加worker数(建议值为2*CPU核心数+1):
    gunicorn --workers 4 --bind 0.0.0.0:8000 your_project.wsgi
    

3. 检查Azure Web App并发限制

低层级的App Service Plan(如免费/共享层)有严格的并发请求限制,可能导致并行请求被阻塞。

  • 查看当前App Service Plan层级,若为基础/标准层以上,确认是否配置了自定义并发限制;
  • 暂时降低前端AJAX请求频率(如把sleep(100)改为sleep(500)),减少并行请求压力。

4. 异步化文件处理逻辑

主请求长时间占用连接会触发Azure网关的并行请求限制,建议将文件处理逻辑异步化:

  • 使用Celery+Redis/RabbitMQ搭建任务队列,主请求仅负责接收文件、启动异步任务后立即返回任务ID;
  • 前端通过任务ID定期AJAX查询任务进度(可借助django-celery-results存储任务状态);
  • 任务处理完成后,前端跳转至结果页面。

5. 验证请求是否真的未到达服务器

Azure日志可能因采样规则未记录请求,可通过Application Insights确认:

  • 在Azure Portal进入应用的Application Insights,查看「请求」面板,筛选AJAX请求路径(ppro_bar/get_progress_data),确认请求是否到达服务器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:45:55