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

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

Есть ли ещё какие-нибудь идеи для реализации вставки динамической картинки?
JOHN_16
В отдаваемом 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

Оба варианта я использую в реальных проектах, Я рассказал в общих чертах. Если что то не ясно или есть вопросы - пишите.
digi
JOHN_16, вот второе решение меня очень даже заинтересовало. Поскольку в джанге новичок, то с кэшами я вообще ещё не разбирался, буду курить.
digi
JOHN_16
Если что то не ясно или есть вопросы - пишите.
Не совсем понял, как использовать KEY_PREFIX, если можно привести пример, а то инфа кратковата. А так с остальным вроде разобрался, действительно передача через кэш будет оптимальным решением.
JOHN_16
digi

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

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

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

Dr.Livsi
Зачем картинку хранить в БД? Если картинка формируется динамически с помощью 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 %}. Так еще больше усложним задачу парсеру.
digi
JOHN_16
Например если вы задали KEY_PREFIX равным ‘foo_’, то ключ кеш-записи будет иметь вид ‘foo_a’. Но получить значение кеш-записи нужно будет так cache.get('a').
Спасибо, понял. Я думал, что с префиксом всё сложнее, и что нужно его программно пристыковывать к имени ключа. А оказалось, что присоединение префикса при доступе к кэшу происходит прозрачно для пользователя, и доступ нужно вести по ключу, как будто бы префикса вообще не было.
digi
Сделал через API кэша и две вьюхи. Первая вьюха выводит веб-страницу и записывает в кэш флаг наличия запроса на изображение, вторая вьюха формирует и отдаёт изображение, если флаг запроса взведён. Если флага нет, то вторая вьюшка отдаёт 404.
JOHN_16
проверь, будет ли у тебя все слаженно работать если, предположим, за секунду 10 пользователей зайдут на страницу/выполнят действия.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB