Программирование на языке Ruby - [212]

Шрифт
Интервал

В классе >CGI имеются методы для генерирования всех элементов HTML-форм. В примере ниже показано, как можно вывести и обработать форму.

>require "cgi"


>def reverse_ramblings(ramblings)

> if ramblings[0] == nil then return " " end

>  chunks = ramblings[0].split(/\s+/)

> chunks.reverse.join(" ")

>end


>cgi = CGI.new("html4")

>cgi.out do

> cgi.html do

>  cgi.body do

>   cgi.hi { "sdrawkcaB txeT" } +

>   cgi.b { reverse_ramblings(cgi['ramblings'])) +

>   cgi.form("action" => "/cgi-bin/rb/form.cgi") do

>    cgi.textarea("ramblings") { cgi['ramblings'] } + cgi.submit

>   end

>  end

> end

>end

Здесь отображается многострочное поле ввода, текст в котором разбивается на слова и выводится в обратном порядке. Так, если набрать фразу «This is a test», то после обработки вы увидите «test a is This». Метод >form класса >CGI принимает параметр >method — один из методов отправки формы, определенных в протоколе HTTP (>GET, >POST и т.д.). По умолчанию предполагается значение >POST.

В этом примере демонстрируется лишь малая толика элементов форм, которые могут встречаться на HTML-странице. Полный перечень вы найдете в любом руководстве по HTML.

19.1.3. Куки

Мы уже упоминали, что HTTP — протокол без состояния. Это означает, что после того как сервер закончил обрабатывать запрос, он не может сказать, пришел ли следующий запрос от того же или какого-либо другого браузера. Тут-то и приходят на помощь куки (cookies) — способ, быть может, несколько грубоватый, сохранить состояние между последовательными запросами от одного и того же браузера.

Механизм куков работает следующим образом. Сервер посылает браузеру команду (в виде HTTP-заголовка) с просьбой сохранить пару имя-значение. Данные могут храниться в памяти или на диске. При каждом последующем запросе к любому серверу из домена, указанного в куке, браузер пошлет сохраненные данные в HTTP-заголовке.

Можно, конечно, читать и формировать куки вручную, но, как вы, наверное, догадались, в этом нет необходимости, поскольку библиотека 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.


Рекомендуем почитать
Графика DirectX в Delphi

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.