WeasyPrint部署至PythonAnywhere后无法渲染数据库上传图片求助
修复WeasyPrint在PythonAnywhere部署后图片不显示的问题
方案1:使用本地文件路径替代静态URL
PythonAnywhere上WeasyPrint通过HTTP访问静态文件易出现权限或路径映射问题,直接传入本地绝对路径更可靠:
- 修改HTML模板中的图片src,移除
{% static %}标签,改用视图传递的绝对路径:
<div class="cont"> <img class="logo1" src="{{ wmsu_logo_absolute_path }}" /> <div> <p>Republic of the Philippines</p> <p>Western Mindanao State University</p> <p>{{ syllabus.college }}</p> <p class="title">DEPARTMENT OF {{ syllabus.department }}</p> </div> <img class="logo2" src="{{ course_logo_absolute_path }}" /> <img class="logo3" src="{{ iso_logo_absolute_path }}" /> </div>
- 在Django视图中计算图片的绝对路径并传递给模板:
def pdf(request, id): # ---------- SYLLABUS ---------- syllabus = get_object_or_404(Syllabus, user_id=request.user, id=id) # ---------- SYLLABUS TEMPLATE ---------- syllabus_template = get_object_or_404(Syllabus_Template, user_id=request.user, id=syllabus.syllabus_template_id.id) wmsu_logo = Logo.objects.get(syllabus_template_id=syllabus_template, name='wmsu_logo') course_logo = Logo.objects.get(syllabus_template_id=syllabus_template, name='course_logo') iso_logo = Logo.objects.get(syllabus_template_id=syllabus_template, name='iso_logo') # 计算图片绝对路径 from django.conf import settings wmsu_logo_path = settings.MEDIA_ROOT / 'upload' / wmsu_logo.img_name course_logo_path = settings.MEDIA_ROOT / 'upload' / course_logo.img_name iso_logo_path = settings.MEDIA_ROOT / 'upload' / iso_logo.img_name template = loader.get_template('PDF_template/template.html') html_string = template.render({ 'wmsu_logo_absolute_path': wmsu_logo_path, 'course_logo_absolute_path': course_logo_path, 'iso_logo_absolute_path': iso_logo_path, 'syllabus': syllabus, }) # 生成PDF时指定本地目录作为base_url pdf = HTML(string=html_string, base_url=f'file://{settings.BASE_DIR}/').write_pdf() response = HttpResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = f'inline; filename=Syllabus{datetime.datetime.now()}.pdf' return response
方案2:修正静态文件访问权限与base_url
若坚持使用静态URL,需确保PythonAnywhere的静态文件配置正确,且WeasyPrint能正常访问:
确认PythonAnywhere静态文件映射:
- 在PythonAnywhere的Web管理页面,找到「Static files」板块,添加映射规则:
- URL:
/static/ - Directory:
/home/你的用户名/项目根目录/static/
- URL:
- 确保
upload文件夹位于static目录下,且文件权限为可读(默认上传文件权限644符合要求)
- 在PythonAnywhere的Web管理页面,找到「Static files」板块,添加映射规则:
修改视图中的base_url为站点根URL:
# 替换原base_url参数,确保WeasyPrint用完整站点URL请求静态资源 pdf = HTML(string=html_string, base_url=request.build_absolute_uri('/')).write_pdf()
方案3:验证文件存在性与路径配置
确认PythonAnywhere上
MEDIA_ROOT配置正确,且目标图片存在:- 在Django shell中执行以下命令查看配置路径:
from django.conf import settings print(settings.MEDIA_ROOT) - 通过PythonAnywhere文件管理器检查对应目录下是否存在
upload文件夹及目标图片。
- 在Django shell中执行以下命令查看配置路径:
核实Logo模型中
img_name字段存储的文件名准确无误,无多余路径前缀或拼写错误。
内容的提问来源于stack exchange,提问作者Rob Roche Villanueva
相关产品推荐
相关产品推荐

