切换网络连接后Weasyprint无法渲染图片及静态文件问题求助
问题核心结论
Weasyprint在联网状态下本身可正常工作,你遇到的问题大概率是网络环境差异导致的资源加载路径/访问权限问题,以下是具体排查和解决步骤:
一、检查静态/媒体文件的URL配置
- 若模板中使用绝对URL(如
https://your-domain.com/static/css/report.css),先在服务器上执行curl https://your-domain.com/static/css/report.css测试,确认光纤网络下服务器域名/IP能被本地访问。若失败,排查DNS解析、防火墙规则或端口开放情况。 - 若使用相对URL(如
/static/css/report.css),生成PDF时必须给Weasyprint指定base_url参数,确保相对路径能被正确解析:from django.template.loader import render_to_string from django.contrib.staticfiles.storage import staticfiles_storage from weasyprint import HTML html_content = render_to_string('report_template.html', context) # 用Django静态存储获取基础URL,或直接指定服务器内部地址 base_url = staticfiles_storage.base_url # 或 base_url = 'http://localhost:8000/' pdf = HTML(string=html_content, base_url=base_url).write_pdf()
二、排查网络环境限制
- 光纤网络可能存在防火墙、代理或内网隔离,阻止Weasyprint访问静态资源的外部URL。可尝试用本地文件路径加载资源,比如将模板中的静态资源URL替换为
file:///path/to/your/static/css/report.css测试。 - 离线时无法加载资源是因为Weasyprint默认通过网络请求资源,此时可将CSS内容直接内联到HTML模板,或提前把静态资源转换为本地路径加载。
三、配置Django的ALLOWED_HOSTS和静态文件服务
- 确保
settings.py中的ALLOWED_HOSTS包含光纤网络下服务器的IP或域名,否则Django会拒绝Weasyprint的请求:# settings.py ALLOWED_HOSTS = ['your-domain.com', '192.168.x.x', 'localhost'] - 生产环境需确认已执行
python manage.py collectstatic收集静态文件,且Nginx等静态文件服务配置正确,光纤网络下能正常访问静态资源。
四、尝试升级Weasyprint版本
Weasyprint 53.4是较旧版本,可能存在资源加载的已知bug,升级到最新稳定版可能解决问题:
pip install --upgrade weasyprint
内容的提问来源于stack exchange,提问作者Inouguys
相关产品推荐
相关产品推荐

