Создание динамических изображений с помощью WSGI без использования файлов
-
05-07-2019 - |
Вопрос
Я хотел бы отправлять моим пользователям динамически созданные изображения, такие как диаграммы, графические изображения и т.д.Эти изображения являются "одноразовыми", они будут отправлены только одному пользователю, а затем уничтожены, отсюда и надпись "никаких задействованных файлов".
Я хотел бы отправить изображение непосредственно пользователю, не сохраняя его сначала в файловой системе.С помощью PHP этого можно достичь, связав изображение в ваших HTML-файлах с PHP-скриптом, таким как:
Редактировать:ТАК что проглотил мой тег с изображением:
<img src="someScript.php?param1=xyz">
Затем скрипт отправил правильные заголовки (filetype=> jpeg и т.д.) в браузер и напрямую записал изображение обратно клиенту, не сохраняя его временно в файловой системе.
Как я мог бы сделать что-то подобное с приложением WSGI?В настоящее время я использую внутренний сервер SimpleWSGI Python.Я знаю, что этот сервер в основном предназначался для демонстрационных целей, а не для реального использования, поскольку ему не хватает возможностей многопоточности, поэтому, пожалуйста, не указывайте мне на это, я в курсе этого, и на данный момент он удовлетворяет моим требованиям :)
Действительно ли это так просто, как поместить URL-адрес в теги изображений и обработать запрос с помощью WSGI, или есть лучшая практика?
У кого-нибудь был какой-либо опыт работы с этим и мог бы дать мне несколько советов (пожалуйста, никаких 32-битных)
Спасибо,
Том
Решение
Это не связано с WSGI, php или какой-либо другой конкретной веб-технологией.рассмотреть
<img src="someScript.php?param1=xyz">
в общем случае для URL someScript.php?param1=xyz
сервер должен возвращать данные типа изображения, и это будет работать
Рассмотрим этот пример:
from wsgiref.simple_server import make_server
def serveImage(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'image/png')]
start_response(status, headers)
return open("about.png", "rb").read()
httpd = make_server('', 8000, serveImage)
httpd.serve_forever()
здесь любой URL-адрес, указывающий на serveImage, вернет действительное изображение, и вы можете использовать его в любом img
тег или любое другое место тега, где может быть использовано изображение, напримерcss или фоновые изображения
Данные изображения могут быть сгенерированы "на лету" с использованием многих сторонних библиотек, напримерPIL и т.д. например, смотрите примеры динамической генерации изображений с использованием библиотеки изображений python http://lost-theory.org/python/dynamicimg.html
Другие советы
ДА.Это так же просто, как поместить URL-адрес на страницу.
<img src="url_to_my_application">
И ваше приложение просто должно вернуть его с правильным mimetype, точно так же, как в PHP или чем-либо другом.Самый простой из возможных примеров:
def application(environ, start_response):
data = open('test.jpg', 'rb').read() # simulate entire image on memory
start_response('200 OK', [('content-type': 'image/jpeg'),
('content-length', str(len(data)))])
return [data]
Конечно, если вы используете фреймворк / вспомогательную библиотеку, в нем могут быть вспомогательные функции, которые облегчат вам задачу.
Я хотел бы добавить в качестве дополнительного комментария, что возможности многопоточности не являются неотъемлемой частью веб-сервера.Если все сделано правильно, вам не нужны потоки для обеспечения хорошей производительности.
Если у вас есть хорошо развитый цикл событий, который переключается между различными запросами, и вы пишете код обработки запросов без использования потоков (возвращая управление серверу как можно чаще), вы можете получить даже лучше производительность по сравнению с использованием потоков, поскольку они ничего не ускоряют и не увеличивают накладные расходы.
Видишь скрученная.паутина для хорошей реализации веб-сервера на python, которая не использует потоки.
Необычный пример, использующий эту технику, пожалуйста, смотрите железная дорога BNF мини-демонстрация схемы.Вы можете получить исходный код из загруженного инструментария WHIFF wsgi toolkit.
Вам следует рассмотреть возможность использования заголовков ETag и обратить на них внимание.Это CGI-скрипт, а не WSGI, но идеи можно перевести: источник спарклайнов -- случается, что он всегда возвращает одно и то же изображение с одними и теми же параметрами, поэтому он использует экстремальное кэширование.