You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django应用生成Word文档后同应用内下载遇404错误如何解决?

解决Django生成Word文档后下载404的问题

让我们一步步拆解这个404问题,从文件生成到URL访问的各个环节排查:

1. 先确认文件是否真的生成了

这是最基础的排查步骤:

  • 手动前往static/documents目录,查看是否存在与你输入文件名匹配的.docx文件
  • 如果文件不存在,先检查views.py里的生成逻辑:
    • 务必用Django配置的STATIC_ROOT拼接保存路径,避免相对路径错误:
      from django.conf import settings
      import os
      
      def ajax_result(request):
          # 获取用户输入的文件名
          file_name = request.GET.get(...) # 或从你的generalData参数中提取
          # 拼接正确的保存目录
          save_dir = os.path.join(settings.STATIC_ROOT, 'documents')
          # 确保目录存在,避免创建文件时报错
          os.makedirs(save_dir, exist_ok=True)
          # 拼接最终文件路径
          doc_path = os.path.join(save_dir, f"{file_name}.docx")
          # 执行文档生成逻辑并保存到doc_path
          # ...
      
    • 检查服务器用户对static/documents目录的写入权限,权限不足会导致文件生成失败

2. 修复下载URL的路径问题

你当前的Download函数使用的是相对路径documents/xxx.docx,这会导致浏览器从当前页面的URL下去查找文件(比如当前页面是/ajax/result/,浏览器会请求/ajax/result/documents/xxx.docx),这显然不是正确的静态文件路径。

解决方案:

在JS里使用完整的静态文件前缀路径:

  • 方法一:利用Django模板的static标签传递根路径(推荐)
    在模板顶部加载static标签,再把静态文件根路径传给JS:
    {% load static %}
    <script>
    const STATIC_ROOT_URL = "{% static '' %}";
    
    $.ajax({ 
        url: '/ajax/result/', 
        data : { 
            'values': JSON.stringify(dataJson), 
            'general': JSON.stringify(generalData) 
        }, 
        method: 'GET', 
        contentType: "application/json", 
        dataType: 'json', 
        success: function (data){
            const fileName = document.getElementById('id_file_name').value;
            // 拼接完整的下载URL
            const downloadUrl = STATIC_ROOT_URL + 'documents/' + fileName + '.docx';
            Download(downloadUrl);
            alert(data);
        }, 
        error: function(data) { 
            alert("something went wrong"); 
        } 
    }); 
    
    function Download(url) { 
        document.getElementById('my_iframe').src = url; 
    };
    </script>
    
  • 方法二:直接硬编码静态文件前缀(适合快速测试)
    修改AJAX成功回调里的路径:
    success: function (data){
        const fileName = document.getElementById('id_file_name').value;
        Download('/static/documents/' + fileName + '.docx');
        alert(data);
    },
    

3. 检查Django的静态文件配置

确保你的settings.py里静态文件相关配置正确:

# settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 开发环境配置(DEBUG=True)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
INSTALLED_APPS = [
    # ...
    'django.contrib.staticfiles', # 确保这个应用在列表中
]

# 如果是生产环境(DEBUG=False),需要配置web服务器(比如Nginx)直接处理静态文件,
# 不推荐使用django.contrib.staticfiles.views.serve视图处理生产环境的静态文件请求

4. 验证URL可访问性

完成以上步骤后,直接在浏览器地址栏输入完整的下载URL(比如http://localhost:8000/static/documents/your-test-file.docx),如果能正常下载,说明问题已解决;如果还是404,再回头检查文件是否生成、路径是否正确。


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

火山引擎 最新活动