Форум сайта python.su
Ребята, подскажите в какую степь копать, а уж реализацию оставьте мне самому. Есть сайт на джанге, теперь нужно по результату вводимой пользователем строки формировать картинку и выводить её на веб-страницу. Картинка у меня формируется, как отдавать картинку пользователю я тоже умею, но тут ведь задача другая: нужно вставлять это динамически сформированное изображение именно в веб-страничку. Вроде как кроме тега <img> в html ничего другого не предусмотрено, а в этом теге есть src= , который должен указывать либо на файл с изображением, либо на скрипт, который будет отдавать динамически динамически сформированное изображение. Поскольку каждый пользователь будет вводить свою строку и кто знает, сколько таких пользователей будет, то каждый раз сохранять изображение в файл не хотелось бы.
Другая идея - указать в src какой-то адрес со строкой в качестве пути, например
http://www.мойсайт.com/string/
Офлайн
В отдаваемом html допустим есть тег img с нужной картникой, src которого будет например /image1.
1)Храним в БД в поле BLOB строкове представление бинарного файла (картинки разумеется). Пишем функцию предсавления, которой соответствует запрос на картинку, и отдаем ее.
2) Храним изображение в кеше Джанги,
from django.core.cache import cache
Офлайн
JOHN_16, вот второе решение меня очень даже заинтересовало. Поскольку в джанге новичок, то с кэшами я вообще ещё не разбирался, буду курить.
Офлайн
JOHN_16Не совсем понял, как использовать KEY_PREFIX, если можно привести пример, а то инфа кратковата. А так с остальным вроде разобрался, действительно передача через кэш будет оптимальным решением.
Если что то не ясно или есть вопросы - пишите.
Офлайн
digi
Суть в том что когда вы делаете что то типа cache.set('a', value, 60), то внутри устройства кеша значению будет соответствовать имя ‘a’ с указанным префиксом. Например если вы задали KEY_PREFIX равным ‘foo_’, то ключ кеш-записи будет иметь вид ‘foo_a’. Но получить значение кеш-записи нужно будет так cache.get('a').
Как написано в доках Джанги, это сделано дабы не произошло смешение записей при использовании нескольких серверов, разном переменном окружении и тп.
P.S. вроде так все
Офлайн
Зачем картинку хранить в БД? Если картинка формируется динамически с помощью 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()
Отредактировано Dr.Livsi (Сен. 20, 2012 16:01:43)
Офлайн
JOHN_16Спасибо, понял. Я думал, что с префиксом всё сложнее, и что нужно его программно пристыковывать к имени ключа. А оказалось, что присоединение префикса при доступе к кэшу происходит прозрачно для пользователя, и доступ нужно вести по ключу, как будто бы префикса вообще не было.
Например если вы задали KEY_PREFIX равным ‘foo_’, то ключ кеш-записи будет иметь вид ‘foo_a’. Но получить значение кеш-записи нужно будет так cache.get('a').
Офлайн
Сделал через API кэша и две вьюхи. Первая вьюха выводит веб-страницу и записывает в кэш флаг наличия запроса на изображение, вторая вьюха формирует и отдаёт изображение, если флаг запроса взведён. Если флага нет, то вторая вьюшка отдаёт 404.
Офлайн
проверь, будет ли у тебя все слаженно работать если, предположим, за секунду 10 пользователей зайдут на страницу/выполнят действия.
Офлайн