Создание динамических изображений с помощью WSGI без использования файлов

StackOverflow https://stackoverflow.com/questions/1001068

  •  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, но идеи можно перевести: источник спарклайнов -- случается, что он всегда возвращает одно и то же изображение с одними и теми же параметрами, поэтому он использует экстремальное кэширование.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top