2013-02-19 1 views
0

Мне нужно, чтобы файл Python действовал так, как будто это изображение. Т.е. путь к файлу Python будет использоваться внутри тега веб-страницы. Файл Python будет динамически создавать изображение с использованием PIL (без промежуточного сохранения в файл).Правильный способ обслуживания динамического изображения в Python/Web.Py с использованием PIL

Я использую Python 2.7, Web.Py, & PIL и разрабатываю 32-разрядную Windows XP с использованием веб-сервера WAMPSS и используя новейший Chrome.

Я почти есть. Я думаю.

Вот вырубать пример моего файла изображения питона:

#!/home/bin/python 
# ############################################################################# 
import web, sys 
from PIL import Image, ImageDraw, ImageFont 
# ############################################################################# 
class debug: 
    def GET(self): 
     # drawing with PIL (Python Image Library) 
     # create a new 256x256 pixel image surface (default is black bg) 
     img = Image.new("RGB", (256, 256)) 
     # set up the new image surface for drawing 
     draw = ImageDraw.Draw (img) 
     # REMOVED - Image manipulation 
     # Output the image to the browser 
     sys.stdout.write('Status: 200 OK\r\n') 
     sys.stdout.write('Content-type: image/png\r\n') 
     sys.stdout.write('\r\n') 
     img.save(sys.stdout, "PNG") 
# ############################################################################# 
urls = ('/debug.py', 'debug') 
app = web.application(urls, globals()) 
if __name__ == "__main__": 
    app.run() 
# ############################################################################# 

Теперь это работает ... Любопытное.

Если я просматриваю этот файл непосредственно в браузере (локальном сервере AMPSS), он показывает изображение. Но для отображения/сервера (5+ секунд) требуется много времени по сравнению с аналогичным PNG-изображением 1k. И консоль Chrome говорит, что она не удалась (хотя я вижу изображение)

Я думаю, что браузер ожидает чего-то еще, что я не отправляю?

Настоящая проблема возникла при использовании этого изображения в JQuery и событии OnLoad. Вещи тогда стали ... странными ... из-за отсутствия лучшего слова. Кажется, у меня есть события (не мои), которые очищают изображение через несколько секунд после его загрузки. &.

обеспечения Chrome Console говорит, что GET не удается при получении изображения (хотя это не делает отображение изображения, по крайней мере, пока что-то в JS делает его исчезнуть снова!)

Интересно, что эта проблема не кажется, появляется в последнем Firefox. Время загрузки преувеличено в последней Opera, но JS не сбивает изображение. То же самое в IE8

Чтобы путать вещи еще больше, у меня есть две машины для Windows XP (32-разрядные). Сжатие JS не происходит на одном из них. И Chrome Console не перечисляет какие-либо ошибки!

Я поставил демку на файл изображения в Интернете здесь: LINKY А мой в разработке страницы, которая использует этот файл здесь: LINKY Jquery/JS будет активировать, если вы щелкаете вокруг белых изображений держателей.

Я понятия не имею, будет ли это работать на вашей установке или нет. Я просто связываюсь здесь для полноты.

Любые идеи о том, что мне не хватает?

ответ

1

В web.py вы должны вернуть содержимое, которое необходимо отправить в браузер. Также используйте web.header для установки HTTP-заголовка.

Сохранить изображение в StringIO и вернуть его содержимое:

import StringIO 

# in GET(self): 
web.header('Content-type', 'image/png') 
buf = StringIO.StringIO() 
img.save(buf, "PNG") 
contents = buf.getvalue() 
return contents 
+0

Я принимаю Ваше предложение является правильным методом для вывода данных, но это может показаться, что мой путь (хотя плохо закодированы) создал тот же результат, где браузер был обеспокоен. Моя проблема, в конце концов я узнал, была вызвана странной ошибкой несовместимости между Chrome & Kaspersky, где байт данных теряется.К сожалению, в моем коде не исправляется, хотя, по крайней мере, я сейчас обслуживаю данные в правильной методологии для Web.Py! – Dave