Django-Weasyprint проблема с изображением

Как сказано на странице документов, я определил тег img в своем html-файле следующим образом:

<img src='{% static 'image.png' %}'/>

Этот URL-адрес существует на сервере, и я даже сделал другое представление с ответом http, и изображение отображается просто отлично. Вот код для обоих представлений:

Просмотр PDF-weasyprint:

def card_view(request):
    template = loader.get_template('card.html')
    context = {'sample': None
               }
    html = template.render(RequestContext(request, context))
    response = HttpResponse(mimetype='application/pdf')
    HTML(string=html).write_pdf(response)
    return response

HTML-представление:

def card_view2(request):
    context = {'sample': None,
               }
    return render_to_response('card.html', context, 
                              context_instance=RequestContext(request))

Я думал, что сборщик URL по умолчанию должен был найти и визуализировать изображение (это png - так что проблема с форматированием не должна быть включена) Есть идеи? Любая помощь будет оценена!!

2 ответа

Решение

В чем именно заключается проблема? Вы что-нибудь получаете в логах? (Вам может потребоваться настроить ведение журнала, если ваш сервер не регистрирует stderr.) Как выглядит сгенерированный HTML?

Мне действительно нужны ответы на приведенное выше, чтобы подтвердить, но я предполагаю, что URL изображения является относительным, но с HTML(string=...) WeasyPrint не знает, что такое базовый URL. Попробуйте что-то вроде этого. (Я не уверен в деталях Джанго.)

HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(response)

Это создаст настоящий HTTP-запрос в вашем приложении, который может зайти в тупик на однопоточном сервере. (Я думаю, что сервер разработки по умолчанию является одним потоком.)

Чтобы избежать этого и затрат на прохождение через сеть, вы можете захотеть написать собственный "сборщик URL-адресов". Это может быть как специализированное изображение, так и одно изображение, и полный эквивалент Django Flask-WeasyPrint.

Здесь это сборщик URL-адресов, который считывает файлы (изображения) локально, не выполняя HTTP-запрос:

      from weasyprint import HTML, CSS, default_url_fetcher
import mimetypes

def weasyprint_local_fetcher(url):
    if url.startswith('local://'):
        filepath = url[8:]
        with open(filepath, 'rb') as f:
            file_data = f.read()
        return {
            'string': file_data,
            'mime_type': mimetypes.guess_type(filepath)[0],
        }
    return default_url_fetcher(url)

Чтобы использовать его, используйте local://схема в ваших URL-адресах, например:

      <img src="local://myapp/static/images/image.svg" />

Затем передайте сборщика в HTML __init__метод:

      html = HTML(
    string=html_string,
    url_fetcher=weasyprint_local_fetcher,
)
Другие вопросы по тегам