cgi.html do
cgi.body do
cgi.h1 { "Hello Again, "} +
cgi.b { cgi['name']}
end
end
end
Здесь мы почти точно воспроизвели функциональность предыдущей программы, воспользовавшись библиотекой CGI. Как видите, класс CGIберет на себя заботу о разборе и сохранении параметров в структуре, напоминающей хэш. Поэтому, если указать URL some_program.cgi?age=4, значение параметра ageможно получить как cgi['age'].
Отметим, что в данном примере нам понадобилось только значение, возвращаемое блоком; HTML-разметка строится постепенно и сохраняется, а не выводится сразу же. Это означает, что конкатенировать строки абсолютно необходимо, иначе мы увидели бы только последнюю вычисленную строку.
В классе CGIесть также удобные механизмы для кодирования строк URL и экранирования специальных символов в HTML и XML-коде. URL-кодирование — это представление «небезопасных» символов с помощью других символов, допустимых в URL. В результате получаются странные строки, изобилующие знаками %, которые вы часто встречали в Web. На самом деле это просто шестнадцатеричные ASCII-коды символов с предшествующим знаком %.
require "cgi"
s = "This| is"^ (aT$test"
s2 = CGI.escape(s) # "This%7C+is%5E%28aT%24test"
puts CGI.unescape(s2) # Печатается "This| is"(aT$test"
Аналогично класс CGIпозволяет экранировать части HTML или XML-текста, которые должны отображаться в браузере буквально. Например, без специальных мер строка ""не будет показана в браузере именно в таком виде. Если необходимо показать саму разметку, например, в качестве примера в руководстве по HTML , то можно воспользоваться классом CGIдля преобразования специальных символов:
require "cgi"
some_text = "This is how you make text bold"
translated = CGI.escapeHTML(some_text)
# "This is how you make text bold"
puts CGI.unescapeHTML(translated)
# Печатается "This is how you make text bold"
19.1.2. Вывод и обработка форм
Наиболее распространенный способ взаимодействия с CGI-программой — форма. HTML-формы создаются с помощью специальных тегов, которые браузер представляет в виде элементов ввода данных. Подробное их обсуждение выходит за рамки данной книги, но существует немало книг и онлайновых руководств по этому предмету.
В классе 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.
Мы уже упоминали, что HTTP — протокол без состояния. Это означает, что после того как сервер закончил обрабатывать запрос, он не может сказать, пришел ли следующий запрос от того же или какого-либо другого браузера. Тут-то и приходят на помощь куки (cookies) — способ, быть может, несколько грубоватый, сохранить состояние между последовательными запросами от одного и того же браузера.
Механизм куков работает следующим образом. Сервер посылает браузеру команду (в виде HTTP-заголовка) с просьбой сохранить пару имя-значение. Данные могут храниться в памяти или на диске. При каждом последующем запросе к любому серверу из домена, указанного в куке, браузер пошлет сохраненные данные в HTTP-заголовке.
Можно, конечно, читать и формировать куки вручную, но, как вы, наверное, догадались, в этом нет необходимости, поскольку библиотека CGI предоставляет класс Cookie, который инкапсулирует все технические детали.
require "cgi"
lastacc = CGI::Cookie.new("kabhi",
"lastaccess=#{Time.now.to_s}")
cgi = CGI.new("html3")
Читать дальше
Конец ознакомительного отрывка
Купить книгу