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

Django Admin导出16000条记录时Nginx报Bad Gateway错误求助

问题原因及解决方法

为什么会出现Bad Gateway错误

  • 请求超时:Nginx、uWSGI/Gunicorn等服务默认有超时时间,导出16000条记录的耗时超过阈值后,Nginx无法等到后端返回结果,就会抛出Bad Gateway。
  • 查询效率低下:你的search_fields包含跨表字段Tags__tag_name,导出时默认查询未做优化,触发了N+1查询——每条SongList记录都要单独查询一次Tags表,大幅增加处理时间。
  • 内存/资源耗尽:一次性加载16000条记录到内存,加上关联数据,可能导致后端进程(比如uWSGI worker)内存占用过高,被系统OOM杀死,Nginx连接不到后端服务就返回502。

解决导出大量数据的方法

1. 优化查询性能

修改SongListAdmin,添加预加载关联数据的逻辑,避免N+1查询:

class SongListAdmin(ImportExportModelAdmin):
    list_display = ('article_title','song_views','date_posted','date_updated','listview')
    search_fields=('article_title','Tags__tag_name')

    def get_queryset(self, request):
        # 根据Tags和SongList的关联类型选择:外键用select_related,多对多用prefetch_related
        return super().get_queryset(request).prefetch_related('Tags')

2. 调整超时设置

  • Nginx端:修改nginx配置文件,延长超时时间,比如设置为300秒:
location / {
    proxy_pass http://your_backend;
    proxy_read_timeout 300s;
    proxy_connect_timeout 300s;
}
  • 后端服务(uWSGI/Gunicorn):同步调整超时参数,比如uWSGI设置harakiri = 300,Gunicorn设置--timeout 300。

3. 分批次流式导出

默认导出会一次性把所有数据加载到内存,改成流式导出可以减少内存占用:
自定义导出逻辑,使用StreamingHttpResponse分批次输出数据:

from django.http import StreamingHttpResponse
import csv
from import_export.admin import ImportExportModelAdmin
from .models import SongList

class StreamingExportMixin:
    def export_action(self, request, *args, **kwargs):
        queryset = self.get_queryset(request)
        
        def stream_csv():
            writer = csv.writer(self.streaming_content)
            # 写入表头
            writer.writerow(['article_title', 'song_views', 'date_posted', 'date_updated', 'listview'])
            # 用iterator()避免一次性加载所有数据到内存
            for obj in queryset.iterator():
                writer.writerow([
                    obj.article_title,
                    obj.song_views,
                    obj.date_posted,
                    obj.date_updated,
                    obj.listview
                ])
        
        response = StreamingHttpResponse(stream_csv(), content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="songlist_export.csv"'
        return response

class SongListAdmin(StreamingExportMixin, ImportExportModelAdmin):
    list_display = ('article_title','song_views','date_posted','date_updated','listview')
    search_fields=('article_title','Tags__tag_name')

    def get_queryset(self, request):
        return super().get_queryset(request).prefetch_related('Tags')

4. 异步导出(可选)

如果数据量持续增长,建议用异步任务(如Celery)处理导出:

  • 后台启动Celery任务生成导出文件,保存到服务器或云存储。
  • 管理面板点击导出后立即返回提示,任务完成后通过邮件或站内消息通知用户下载链接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:52:51