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

Django中HTML转PDF生成后,下载链接触发404错误求助

解决Django中PDF下载链接404的问题

我之前也踩过类似的坑,大概率是资源配置或者路径生成的问题,咱们一步步排查:

1. 先把pdf_files目录配置成Django可访问的媒体资源

Django不会默认开放项目里的任意文件夹,所以得先在settings.py里做配置:

# settings.py
import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

# 配置媒体文件根目录和访问URL
MEDIA_ROOT = os.path.join(BASE_DIR, 'pdf_files')
MEDIA_URL = '/pdfs/'

然后去项目根目录的urls.py里添加媒体文件的路由(只在开发环境这么做,生产环境要用Nginx/Apache托管):

# urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 你的其他路由(比如admin、app路由)都放这里
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2. 检查视图返回的链接路径是否正确

别自己硬写路径!要用Django提供的配置来生成正确的链接,比如这样:

# views.py
from django.conf import settings
from django.http import JsonResponse
import os

def get_pdf_download_link(request):
    # 假设你的PDF文件名是generated_report.pdf
    pdf_filename = "generated_report.pdf"
    # 先确认文件真的存在
    pdf_full_path = os.path.join(settings.MEDIA_ROOT, pdf_filename)
    if not os.path.exists(pdf_full_path):
        return JsonResponse({"error": "PDF文件未生成"}, status=404)
    # 生成正确的绝对路径链接
    download_url = request.build_absolute_uri(f"{settings.MEDIA_URL}{pdf_filename}")
    return JsonResponse({"download_link": download_url})

这样返回的链接应该是类似http://localhost:8000/pdfs/generated_report.pdf,而不是/pdf_files/xxx.pdf——后者Django找不到对应的路由。

3. 排查路由冲突问题

如果你的项目里有其他路由用了/pdfs/这个前缀(比如某个app的路由是path('pdfs/', include('pdf_app.urls'))),那媒体文件的路由会被覆盖,导致404。这时候要把媒体文件的static配置放在urlpatterns的最后,让它最后匹配。

4. 开发环境别忘开DEBUG模式

如果settings.py里DEBUG = False,那上面的static路由配置是不生效的,开发环境一定要把DEBUG设为True;生产环境则要换用服务器托管媒体文件,不能依赖Django的static函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:39:03