Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Вывод динамической картинки в веб-страницу [RSS Feed]

#1 Сен. 18, 2012 10:05:44

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Вывод динамической картинки в веб-страницу

Ребята, подскажите в какую степь копать, а уж реализацию оставьте мне самому. Есть сайт на джанге, теперь нужно по результату вводимой пользователем строки формировать картинку и выводить её на веб-страницу. Картинка у меня формируется, как отдавать картинку пользователю я тоже умею, но тут ведь задача другая: нужно вставлять это динамически сформированное изображение именно в веб-страничку. Вроде как кроме тега <img> в html ничего другого не предусмотрено, а в этом теге есть src= , который должен указывать либо на файл с изображением, либо на скрипт, который будет отдавать динамически динамически сформированное изображение. Поскольку каждый пользователь будет вводить свою строку и кто знает, сколько таких пользователей будет, то каждый раз сохранять изображение в файл не хотелось бы.

Другая идея - указать в src какой-то адрес со строкой в качестве пути, например

http://www.мойсайт.com/string/
и с помощью url.py и вьюшки вместо странички отдавалось бы нужное изображение.
Беда в том, что пользователи быстро прочухают, что для получения итогового изображения можно не заходить на сайт, а просто набирать в браузере исходную строку http://www.мойсайт.com/string/ и получать в итоге изображение (достаточно увидеть исходник страницы). Вот если бы как-то можно было указать в качестве src скрипт без параметров, но как тогда передать ему этот параметр?

Есть ли ещё какие-нибудь идеи для реализации вставки динамической картинки?

Офлайн

#2 Сен. 18, 2012 10:53:30

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вывод динамической картинки в веб-страницу

В отдаваемом html допустим есть тег img с нужной картникой, src которого будет например /image1.
1)Храним в БД в поле BLOB строкове представление бинарного файла (картинки разумеется). Пишем функцию предсавления, которой соответствует запрос на картинку, и отдаем ее.
2) Храним изображение в кеше Джанги,

from django.core.cache import cache
https://docs.djangoproject.com/en/1.4/topics/cache/#the-low-level-cache-api

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 18, 2012 12:11:59

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Вывод динамической картинки в веб-страницу

JOHN_16, вот второе решение меня очень даже заинтересовало. Поскольку в джанге новичок, то с кэшами я вообще ещё не разбирался, буду курить.

Офлайн

#4 Сен. 19, 2012 17:02:14

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Вывод динамической картинки в веб-страницу

JOHN_16
Если что то не ясно или есть вопросы - пишите.
Не совсем понял, как использовать KEY_PREFIX, если можно привести пример, а то инфа кратковата. А так с остальным вроде разобрался, действительно передача через кэш будет оптимальным решением.

Офлайн

#5 Сен. 20, 2012 07:38:33

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вывод динамической картинки в веб-страницу

digi

Суть в том что когда вы делаете что то типа cache.set('a', value, 60), то внутри устройства кеша значению будет соответствовать имя ‘a’ с указанным префиксом. Например если вы задали KEY_PREFIX равным ‘foo_’, то ключ кеш-записи будет иметь вид ‘foo_a’. Но получить значение кеш-записи нужно будет так cache.get('a').

Как написано в доках Джанги, это сделано дабы не произошло смешение записей при использовании нескольких серверов, разном переменном окружении и тп.

P.S. вроде так все



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Сен. 20, 2012 13:50:08

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Вывод динамической картинки в веб-страницу

Зачем картинку хранить в БД? Если картинка формируется динамически с помощью python-кода, то решение таково:
1) src для img формируется динамически таким образом, что бы в параметрах url-строки были все необходимые для формирования картинки данные
2) в urls.py пишется соответствующий url-адрес с использованием регулярок
3) для данного url пишется соответсвующая функцию view, принимающая параметры из адреса, плюс, возмжно, какие-то параметры из строки Get-запроса. Эта вью возвращает сформированную картинку. Эту вью можно закэшировать. Можно даже не кэшировать, а настроить веб-сервер таким образом, что бы он всяческую статику кэшировал (*.js, *.jpg, *.css и проч.)

Для того, что бы пользователь не смог получить картинку просто введя нужный ему url можно использовать ajax-запросы. Т.е. при щелчке по ссылке внутри страницы (ну или при загрузки страницы) должен запускаться скрипт, котоорый формирует ajax-запрос для получения строки <img src='asfasfsf'>. При этом внутрь вьюхи, отдающей рисунок поставить код:

if request.is_ajax():
формируем и возвращаем картинку
else:
raise Http404()
Таким образом, вьюха будет принимать только соответствующим образом сформированные ajax-запросы. (просто так в адресной строке src картинки уже не введешь). Правда если будет работать парсер, то он все равно сможет это обойти формируя соответствующим образом запросы (но это все равно довольно сильно усложнит дело).

Есть еще более крутой вариант:
на странице делаешь форму с одной единственной кнопкой “показать рисунок”, к ней привязываешь соответствующий скрипт, который все так же через ajax-подгружает данные в виде рисунка на страницу. метод формы - post. и добавляешь {% csrf_token %}. Так еще больше усложним задачу парсеру.



Отредактировано Dr.Livsi (Сен. 20, 2012 16:01:43)

Офлайн

#7 Сен. 21, 2012 01:25:53

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Вывод динамической картинки в веб-страницу

JOHN_16
Например если вы задали KEY_PREFIX равным ‘foo_’, то ключ кеш-записи будет иметь вид ‘foo_a’. Но получить значение кеш-записи нужно будет так cache.get('a').
Спасибо, понял. Я думал, что с префиксом всё сложнее, и что нужно его программно пристыковывать к имени ключа. А оказалось, что присоединение префикса при доступе к кэшу происходит прозрачно для пользователя, и доступ нужно вести по ключу, как будто бы префикса вообще не было.

Офлайн

#8 Сен. 21, 2012 22:16:50

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Вывод динамической картинки в веб-страницу

Сделал через API кэша и две вьюхи. Первая вьюха выводит веб-страницу и записывает в кэш флаг наличия запроса на изображение, вторая вьюха формирует и отдаёт изображение, если флаг запроса взведён. Если флага нет, то вторая вьюшка отдаёт 404.

Офлайн

#9 Сен. 23, 2012 14:12:25

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вывод динамической картинки в веб-страницу

проверь, будет ли у тебя все слаженно работать если, предположим, за секунду 10 пользователей зайдут на страницу/выполнят действия.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

  • Начало
  • » Django
  • » Вывод динамической картинки в веб-страницу[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version