Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Можно, конечно, читать и формировать куки вручную, но, как вы, наверное, догадались, в этом нет необходимости, поскольку библиотека CGI предоставляет класс

Cookie
, который инкапсулирует все технические детали.

require "cgi"

lastacc = CGI::Cookie.new("kabhi",

 "lastaccess=#{Time.now.to_s}")

cgi = CGI.new("html3")

if cgi.cookies.size < 1

 cgi.out("cookie" => lastacc) do

"Hit refresh for a lovely cookie"

 end

else

 cgi.out("cookie" => lastacc) do

cgi.html do

"Hi, you were last here at: "+

"#{cgi.cookies['kabhi'].join.split(' = ')[1]}"

end

 end

end

Здесь создается кук

"kabhi"
, ключ которого
"lastaccess"
содержит текущее время. Если у браузера уже был такой кук, то выводится его значение. Куки хранятся в хэше, который является переменной экземпляра в классе CGI. Каждый кук может содержать несколько пар ключ-значение, поэтому при доступе к куку по имени вы получаете массив.

19.1.4. Сеансы пользователей

Куки — это хорошо, если вам нужно сохранить простые данные и вы не прочь возложить на браузер заботу об их хранении. Но часто предъявляются более жесткие требования. Что если нужно сохранить много данных и вы не хотите гонять их «взад-вперед» при каждом запросе? К тому же данные могут быть секретными, так что доверять их хранение браузеру нежелательно.

В таких случаях можно воспользоваться классом

CGI::Session
. Он аналогичен классу
CGI::Cookie
в том смысле, что значения хранятся в структуре, напоминающей хэш.

require "cgi"

require "cgi/session"

cgi = CGI.new("html4")

sess = CGI::Session.new(cgi, "session_key" => "a_test",

 "prefix" => "rubysess.")

lastaccess = sess["lastaccess"].to_s

sess["lastaccess"] = Time.now

if cgi['bgcolor'][0] =~ /[a-z]/

 sess["bgcolor"] = cgi['bgcolor']

end

cgi.out do

 cgi.html do

cgi.body ("bgcolor" => sess["bgcolor"]) do

"Фон этой страницы" +

"изменяется в зависимости от значения 'bgcolor'," +

"хранящегося в сеансе каждого пользователя." +

"Время последнего доступа: #{lastaccess}"

end

 end

end

Если обратиться к URL

/thatscript.cgi?bgcolor=red
, то фоновый цвет страницы у данного пользователя станет красным и останется таким до тех пор, пока он не обратится к такому же URL, но с другим значением параметра
"bgcolor"
. При создании объекта
CGI::Session
указываются объект
CGI
и набор параметров в хэше. Необязательный параметр
session_key
определяет ключ, с помощью которого браузер будет идентифицировать себя при каждом запросе. Сеансовые данные хранятся во временном файле, своем для каждого сеанса, а параметр
prefix
задает строку, с которой должно начинаться имя файла, чтобы проще было опознать все такие файлы в файловой системе сервера.

Классу

CGI::Session
пока недостает многих возможностей, в частности умения хранить объекты, отличные от
String
, организации общего хранилища сеансовых данных для нескольких серверов и пр. К счастью, уже готов подключаемый механизм
database_manager
, так что некоторые из этих функций нетрудно добавить. Если вы придумаете что-нибудь интересное в отношении класса
CGI::Session
, не забудьте поделиться с сообществом.

19.2. FastCGI

Чаще всего CGI критикуют за то, что при каждом запросе создается новый процесс, и это заметно снижает производительность. Невозможность сохранять в памяти объекты между последовательными запросами также не украшает дизайн системы. Для разрешения этих проблем была создана технология FastCGI.

По сути дела, FastCGI — это определение и программная реализация протокола. Обычно она реализуется в надстройки над Web-сервером, например модуля в случае сервера Apache. FastCGI позволяет работающему внутри процесса компоненту перехватывать HTTP-запросы и направлять их через сокет другому процессу, работающему в течение длительного времени. По сравнению с традиционным порождением новых процессов это существенно ускоряет работу. Кроме того, программист получает возможность оставить данные в памяти и найти их там при обработке следующего запроса.

Серверы, адаптированные для работы с FastCGI, реализованы на многих языках, в том числе на Ruby. Эли Грин (Eli Green) написал целиком на Ruby модуль (он есть в архиве RAA), который реализует протокол FastCGI и упрощает разработку FastCGI-программ.

Не вдаваясь в детали реализации, мы представили в листинге 19.1 пример приложения. Как видите, он повторяет функциональность предыдущего примера.

Листинг 19.1. Пример FastCGI

require "fastcgi"

require "cgi"

last_time = ""

def get_ramblings(instream)

 # He слишком красивый способ извлечь значение из первой пары

 # имя-значение. CGI сделал бы это за нас.

 data = ""

 if instream != nil

data = instream.split("&")[0].split(" = ")[1] || ""

 end

 return CGI.unescape(data)

end

Поделиться:
Популярные книги

Королевский крест

Панов Вадим Юрьевич
10. Тайный Город
Фантастика:
боевая фантастика
9.09
рейтинг книги
Королевский крест

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Кромвель

Павлова Татьяна Александровна
611. Жизнь замечательных людей
Проза:
историческая проза
6.00
рейтинг книги
Кромвель

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Милосердие палача

Смирнов Виктор Васильевич
3. Адъютант его превосходительства
Приключения:
исторические приключения
7.38
рейтинг книги
Милосердие палача

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Лев Толстой

Шкловский Виктор Борисович
363. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Лев Толстой

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
4.75
рейтинг книги
Газлайтер. Том 14

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Смертельный танец

Гамильтон Лорел Кей
6. Анита Блейк
Фантастика:
ужасы и мистика
9.29
рейтинг книги
Смертельный танец

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Эпоха Опустошителя. Том II

Павлов Вел
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том II

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска