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-текста, которые должны отображаться в браузере буквально. Например, без специальных мер строка '<some_stuff>' не будет показана в браузере именно в таком виде. Если необходимо показать саму разметку, например, в качестве примера в руководстве по HTML , то можно воспользоваться классом CGI для преобразования специальных символов:

require 'cgi'

some_text = '<B>This is how you make text bold</B>'

translated = CGI.escapeHTML(some_text)

# '<B>This is how you make text bold</B>'

puts CGI.unescapeHTML(translated)

# Печатается '<B>This is how you make text bold</B>'

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.

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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату