Работа с баннерами

Задача
Вы хотите выводить рекламные баннеры, произвольно выбирая изображения из имеющегося набора.

Решение
Используйте сценарий, случайным образом выбирающий строку из таблицы изображений и отправляющий изображение клиенту.

Обсуждение
В только что рассмотренном сценарии display_image.pl предполагалось, что URL содержит параметр с указанием имени изображения для отправки клиенту. Другие приложения могут самостоятельно определять, какое изображение выводить. Весьма популярным применением веб-программирования с участием изображений является вывод рекламных баннеров на веб-страницах. Можно без труда решить эту задачу с помощью сценария, при каждом запуске выбирающего произвольное изображение. Рассмотрим сценарий на Python banner.py, который показывает, как это сделать, при этом «рекламой» будут служить изображения флагов из таблицы image:

#! /usr/bin/python
# banner.py – отправка произвольно выбранного баннера из таблицы image
# (если изображение не найдено, ответ не отправляется)
import sys
sys.path.insert (0, "/usr/local/apache/lib/python")
import MySQLdb
import Cookbook
conn = Cookbook.connect ()
try:
query = "SELECT type, data FROM image ORDER BY RAND() LIMIT 1"
cursor = conn.cursor ()
cursor.execute (query)
row = cursor.fetchone ()
cursor.close ()
if row is not None:
(type, data) = row
# Отправить изображение клиенту с заголовками Content-Type:
# и Content-Length:.


Заголовки Expires:, Cache-Control: и Pragma: помогают
# предотвратить кэширование изображения в броузере и его повторное
# использование при последующем запуске сценария.
print "Content-Type: %s" % type
print "Content-Length: %s" % len (data)
print "Expires: Sat, 01 Jan 2000 00:00:00 GMT"
print "Cache-Control: no-cache"
print "Pragma: no-cache"
print ""
print data
except MySQLdb.Error, e:
pass
conn.close ()

Сценарий banner.py отправляет еще несколько заголовков в дополнение к обычным Content-Type: и Content-Length:. Эти новые заголовки не дают броузерам кэшировать изображение. Expires: указывает дату в прошлом, чтобы сообщить броузеру о том, что изображение уже устарело. Заголовки Cache-Control: и Pragma: сообщают броузеру о том, что не следует кэшировать изо-бражение. Сценарий отправляет оба заголовка, так как некоторые броузеры понимают только первый, а некоторые – только второй.

Почему запрещается кэширование? Если не сделать этого, броузер отправит запрос banner.py только первый раз, когда он увидит такую ссылку. При последующих запросах сценария броузер будет повторно использовать изображение, что сделает невозможным вывод произвольно выбранного изображения для каждой такой ссылки.

Установите сценарий banner.py в каталог cgi-bin.


Для того чтобы разместить баннер на веб-странице, используйте тег для вызова сценария. Например, если сценарий сохранен как /cgi-bin/banner.py, то следующая страница будет ссылаться на него, выводя изображение под поясняющим абзацем:




Banner Ad Test Page 1

(body bgcolor="white")

You should see an image below this paragraph.



(/body)


Если запросить эту страницу, она должна вывести изображение, причем при каждом перезапросе страницы должно выводиться новое изображение. (Я считаю, что вы к этому времени загрузили в таблицу image множество изображений, используя сценарий store_image.pl. В противном случае вы можете вообще ничего не увидеть!) Если вы изменяете banner.py так, чтобы он не отправлял заголовки, управляющие кэшированием, то, вероятно, при каждой загрузке страницы будет отображаться одна и та же картинка.

Управляющие кэшированием заголовки запрещают его для ссылок на bannery. py в процессе последовательных обращений к странице.


Все усложняется, если несколько ссылок на сценарий присутствует на одной странице – смотрите, что получится:




Banner Ad Test Page 2

(body bgcolor="white")

You should see two images below this paragraph,
and they probably will be the same.



You should see two images below this paragraph,
and they probably will be different.




(/body)


Две первые ссылки на banner.py идентичны. Запросив эту страницу в броузере вы, вероятно, заметите, что на веб-сервер отправляется только один запрос и для обеих ссылок подставляется одно и то же изображение. В результате две первые картинки будут идентичны. Две другие ссылки на banner.py демонстрируют решение проблемы. В конце URL ссылок присутствуют параметры, которые делают их разными. Сценарий banner.py не использует эту информацию, но нам удалось обмануть броузер – считая, что ссылки разные, броузер отправляет два запроса на изображение. В результате вторая пара включает разные изображения – если только не получится так, что banner.
py случайно выберет одну и ту же картинку два раза подряд.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Извлечение изображений и других двоичных данных
Использование результатов запроса для загрузки файлов
Представление результатов запроса в виде абзацев
Представление результатов запроса в виде гиперссылок
Представление результатов запроса в виде списков