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

WeasyPrint部署至PythonAnywhere后无法渲染数据库上传图片求助

修复WeasyPrint在PythonAnywhere部署后图片不显示的问题

方案1:使用本地文件路径替代静态URL

PythonAnywhere上WeasyPrint通过HTTP访问静态文件易出现权限或路径映射问题,直接传入本地绝对路径更可靠:

  1. 修改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>
  1. 在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能正常访问:

  1. 确认PythonAnywhere静态文件映射:

    • 在PythonAnywhere的Web管理页面,找到「Static files」板块,添加映射规则:
      • URL: /static/
      • Directory: /home/你的用户名/项目根目录/static/
    • 确保upload文件夹位于static目录下,且文件权限为可读(默认上传文件权限644符合要求)
  2. 修改视图中的base_url为站点根URL:

# 替换原base_url参数,确保WeasyPrint用完整站点URL请求静态资源
pdf = HTML(string=html_string, base_url=request.build_absolute_uri('/')).write_pdf()

方案3:验证文件存在性与路径配置

  1. 确认PythonAnywhere上MEDIA_ROOT配置正确,且目标图片存在:

    • 在Django shell中执行以下命令查看配置路径:
      from django.conf import settings
      print(settings.MEDIA_ROOT)
      
    • 通过PythonAnywhere文件管理器检查对应目录下是否存在upload文件夹及目标图片。
  2. 核实Logo模型中img_name字段存储的文件名准确无误,无多余路径前缀或拼写错误。

内容的提问来源于stack exchange,提问作者Rob Roche Villanueva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:12:38