Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
В классе 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.
По сути дела, FastCGI — это определение и программная реализация протокола. Обычно она реализуется в надстройки над Web-сервером, например модуля в случае сервера Apache. FastCGI позволяет работающему внутри процесса компоненту перехватывать HTTP-запросы и направлять их через сокет другому процессу, работающему в течение длительного времени. По сравнению с традиционным порождением новых процессов это существенно ускоряет работу. Кроме того, программист получает возможность оставить данные в памяти и найти их там при обработке следующего запроса.
Серверы, адаптированные для работы с FastCGI, реализованы на многих языках, в том числе на Ruby. Эли Грин (Eli Green) написал целиком на Ruby модуль (он есть в архиве RAA), который реализует протокол FastCGI и упрощает разработку FastCGI-программ.
Не вдаваясь в детали реализации, мы представили в листинге 19.1 пример приложения. Как видите, он повторяет функциональность предыдущего примера.
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
def reverse_ramblings(ramblings)
Интервал:
Закладка: