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目录的写入权限,权限不足会导致文件生成失败
- 务必用Django配置的
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




