Django中使用embed标签加载PDF文件失败的问题求助
我来帮你搞定这个PDF加载404的问题,核心原因是开发模式下Django不会自动托管媒体文件,下面一步步来排查解决:
1. 最关键的修复:配置媒体文件URL路由
Django在DEBUG=True的开发环境中,默认不会处理媒体文件的HTTP请求,必须在根URL配置文件(也就是你的etalentNET/urls.py)里添加专门的路由规则,让Django能找到并返回你的PDF文件。
修改根urls.py的具体操作:
打开etalentNET/urls.py,补充以下代码:
from django.conf import settings from django.conf.urls.static import static # 你已有的路由规则(比如admin、INTRANET的路由)保持不变 urlpatterns = [ path('admin/', admin.site.urls), path('INTRANET/', include('INTRANET.urls')), # 其他已有的路由... ] # 仅在开发环境下添加媒体文件服务路由 if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
这段代码的作用是:当DEBUG为True时,把MEDIA_URL对应的请求映射到MEDIA_ROOT指定的本地目录,这样Django就能正确返回你的PDF文件了。
2. 确认MEDIA_ROOT路径是否正确
虽然你说文件确实在目标路径,但可以再验证一下MEDIA_ROOT的绝对路径是否和实际存储路径一致:
在终端运行Django shell:
python manage.py shell
然后输入以下代码查看路径:
from django.conf import settings print(settings.MEDIA_ROOT)
输出的绝对路径应该和你本地存储文件的路径完全匹配,比如如果你的项目根目录是/Users/yourname/etalentNET,那么MEDIA_ROOT应该是/Users/yourname/etalentNET/INTRANET/uploads,确保curriculums/CV_2017.pdf确实在这个目录下。
3. 检查文件权限(可选)
如果前面两步都没问题,可能是文件权限导致服务器读取不到文件:
在Linux/macOS下可以执行以下命令赋予文件可读权限:
chmod 644 INTRANET/uploads/curriculums/CV_2017.pdf
Windows系统一般不需要额外设置权限,确保文件没有被锁定即可。
4. 验证模板中的路径输出
最后,检查页面源码里embed标签的src属性是否正确:打开网页后右键查看源码,找到embed标签,确认src的值是/INTRANET/uploads/curriculums/CV_2017.pdf,和你访问的URL一致。
完成以上步骤后,重启Django开发服务器,应该就能正常加载PDF文件了。
内容的提问来源于stack exchange,提问作者Nicolas Fuchs

