Создание динамических изображений с WSGI, без файлов - PullRequest
3 голосов
/ 16 июня 2009

Я хотел бы отправлять динамически созданные изображения своим пользователям, такие как диаграммы, графики и т. Д. Эти изображения являются "одноразовыми" изображениями, они будут отправлены только одному пользователю и затем уничтожены, следовательно, "файлы не задействованы" ».

Я хотел бы отправить изображение непосредственно пользователю, не сохраняя его сначала в файловой системе. С помощью PHP это может быть достигнуто путем связывания изображения в ваших файлах HTML со скриптом PHP, таким как:

редактировать: ТАК поглотил мой тег изображения:

<img src="someScript.php?param1=xyz">

Затем сценарий отправил правильные заголовки (filetype => jpeg и т. Д.) В браузер и напрямую записал изображение обратно клиенту, без временного сохранения его в файловой системе.

Как я мог сделать что-то подобное с приложением WSGI. В настоящее время я использую внутренний сервер SimpleWSGI Python. Мне известно, что этот сервер был предназначен главным образом для демонстрационных целей, а не для реального использования, поскольку ему не хватает возможностей многопоточности, поэтому, пожалуйста, не указывайте мне это, я в курсе, и на данный момент он удовлетворяет моим требованиям: ) * +1010 *

Это действительно так просто, как вставить URL-адрес в теги изображения и обработать запрос с помощью WSGI, или есть лучший способ?

Кто-нибудь имел опыт работы с этим и мог бы дать мне несколько советов (нет 32-битных, пожалуйста)

Спасибо

Tom

Ответы [ 4 ]

8 голосов
/ 16 июня 2009

Это не относится к 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 / питон / dynamicimg.html

2 голосов
/ 16 июня 2009

YES. Это так же просто, как разместить 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]

Конечно, если вы используете библиотеку framework / helper, у нее могут быть вспомогательные функции, которые облегчат вам задачу.

Я хотел бы добавить в качестве дополнительного комментария, что возможности многопоточности не являются существенными на веб-сервере. Если все сделано правильно, вам не нужны потоки для хорошей производительности.

Если у вас есть хорошо разработанный цикл обработки событий, который переключается между различными запросами, и вы пишете свой код обработки запросов в режиме без потоков (возвращая управление серверу как можно чаще), вы можете получить даже Лучшая производительность, чем при использовании потоков, поскольку они не заставляют что-либо работать быстрее и увеличивают накладные расходы.

См. twisted.web для хорошей реализации веб-сервера Python, которая не использует потоки.

0 голосов
/ 31 июля 2009

Вам следует подумать об использовании и обращении внимания на заголовки ETag. Это сценарий CGI, а не WSGI, но идеи можно перевести: источник спарклайнов - случается, что всегда возвращается одно и то же изображение для одних и тех же параметров, поэтому он практикует экстремальное кэширование.

0 голосов
/ 24 июля 2009

Необычный пример, использующий эту технику, смотрите железная дорога БНФ диаграмма WHIFF мини-демо . Вы можете получить исходный код из загрузки инструментария WHIFF wsgi.

...