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
相关产品推荐
相关产品推荐

