Печать в PDF шаблона Django с помощью интерфейса Google Chrome Remote
У меня есть сервер Django (Django==1.11.7)
Этот сервер Django работает на виртуальной машине ( myvm), и я обращаюсь к его содержимому с хост-компьютера (не очень актуально, просто чтобы дать некоторый контент тому, что означает myvm)
Этот сервер Django обслуживает шаблон.
Внутри этого шаблона я ссылаюсь на некоторые статические файлы. Например:
<link rel="stylesheet" href="http://myvm:8080/static/css/mycss.css">
<img src="http://myvm:8080/static/images/myimage.png">
Если я curl
или запросите эти файлы у python
например, он работает, как с моей хост-машины, так и с виртуальной машины.
requests.get("http://myvm:8080/static/css/mycss.css").text
Это, например, возвращает ожидаемый контент.
В браузере HTML отображается правильно.
Доступ к моему серверу Django как с хоста, так и с виртуальной машины приводит к совершенно хорошей странице.
Более того, копирование исходного кода страницы и доступ к файлу также отображаются правильно. Например, если я буквально скопирую, вставьте источник из браузера в mysite.html
и посмотри на это, file:///some/local/path/mysite.html
это также делает правильно.
Просматривая логи Django, я вижу такие сообщения:
[15/Dec/2017 00:00:00 - 1513349355] INFO [django.server:124] "GET /static/images/myimage.png HTTP/1.1" 200 68
То же самое для CSS или сценариев. Статический файл mysite.html
видит ссылки на файлы на этом сервере, запрашивает их и успешно принимает их.
То же самое происходит, если я выключаю сервер Django и просто python -m SimpleHTTPServer
в каталоге, где у меня есть мой статический каталог.
Если я заменю myvm:8080
с myvm:8000
Я получаю эту сторону сервера, и она отрисовывается отлично.
IP - - [15/Dec/2017 00:00:00] "GET /static/css/mycsscss HTTP/1.1" 200 -
Все идет нормально.
Проблемы возникают, когда я пытаюсь распечатать mysite.html
в PDF.
Таким образом я пытаюсь печатать в PDF. у меня есть node
сервер прослушивает порт 3000 для запросов POST. Он ожидает JSON, который содержит путь к файлу. Получив этот путь, он начнет процесс печати этого файла в PDF-файл, используя Chrome (59.0) в автономном режиме и Chrome Remote Interface ("chrome-remote-interface": "0.22.0").
Так, например, если я отправлю:
requests.post('http://myvm:3000', json={"file_name": "/some/local/path/mysite.html"})
node
Сервер будет делать что-то вроде:
new CDP(
{port: google_chrome_port},
generate_pdf({url: 'file:///some/local/path/mysite.html', port: google_chrome_port})
)
Он подключается к работающему экземпляру Chrome Headless,
и имеет обратный вызов generate_pdf
что говорит Chrome перейти к данному URL и один раз loadEventFired
срабатывает, он должен вызвать printToPDF
,
Процесс сам по себе работает, так как в нем создается PDF с текстом. Тем не менее, ни стили, ни изображения, ни статические файлы в целом не загружаются, а это означает, что созданный PDF-файл выглядит ужасно.
Сначала я попытался отобразить шаблон как есть, со ссылками на myvm:8080
(сервер Django).
Я получаю журналы, которые говорят это:
[15/Dec/2017 00:00:00 - 1513351221] WARNING [django.server:124] "GET http://myvm:8080/static/css/mycss.css HTTP/1.1" 404 1760
Подобные журналы происходят для изображений или сценариев. Теперь, что я заметил, но не понимаю.
Во-первых, если я скопирую и вставлю адрес (http://myvm:8080/static/css/mycss.css
) и сверните его, я получаю ожидаемый контент. Почему это 404?
Во-вторых, в отличие от запросов, сделанных файлом при визуализации в браузере, он имеет полный путь, а не просто static/css/mycss.css
, Почему это происходит?
То, что я попробовал после того, как обслуживал статические файлы, используя python -m SimpleHTTPServer
Я изменил свой источник для ссылки на файлы с myvm:8000
, Опять же, это не работает. В отличие от сервера Django, этот тип сервера вообще не подвержен запросам.
Если я скручиваюсь для http://myvm:8000/static/css/mycss.css
например, я вижу журнал как IP - - [15/Dec/2017 00:00:00] "GET /static/css/mycss.css HTTP/1.1" 200 -
и если я запрашиваю что-то, что не существует, я получаю IP - - [15/Dec/2017 00:00:00] "GET /static/css/does_not_exist.css HTTP/1.1" 404 -
Тот факт, что я не вижу никаких журналов, говорит мне, что Chrome не пытается загрузить эти файлы. Почему это происходит?
Точно так же я пытался изменить mysite.html
ссылаться на файлы статически
<img src="static/images/myimage.png">
HTML правильно отображается в браузере, однако Chrome не загружает изображения, CSS и т. Д.
Я также пытался ждать дольше (вместо запуска рендеринга PDF, когда loadEventFired
бывает, я жду несколько секунд) но и это оказалось бесполезным.
Tl; Dr:
Как заставить Google Chrome Headless загружать статические файлы?
Спасибо!