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,
)