воскресенье, 25 мая 2008 г.

Введение и web.py

В сети появился еще один блог :). Надеюсь будет кому-то полезным. Писать буду про то, с чем сталкиваюсь ковыряя очередную свою поделку, но в основном всё будет крутиться вокруг Python, Linux и web-штучек в целом. В последнее время взялся за свой первый в жизни сайт =) Это морда к сервру Ragnarok для моего любительского игрового проекта simhost.org. В качестве средства решения задачи выбрал web.py, т.к. по заверениям авторов он простой, как три копейки и ни в чем не ограничивает свободу выбора. В итоге два дня убил на лазание по инету, ознакомление с туториалами и немногочисленными примерами. Время провел с пользой: пощупал вживую CSS, вдоволь начитался споров про HTML vs XHTML, начал осиливать vim (это моя, наверное, уже пятая попытка, но на этот раз зашел дальше всего) и вообще нагрузил себя новой информацией по самую макушку. В итоге web.py оказался действительно простым и действительно гибким. В web.py все данные от пользователя можно получить через web.input(), который возвращает словарь (если быть точнее, то ThreadedDict), но возникла небольшая заминка: как разделить переменные полученные в теле POST запроса от тех, что переданы через URL. Если это сделать, то можно более четко определить, что ты хочешь и чего ты не хочешь от программы. В частности при валидации форм мне видется это полезным. Чтобы наглядно показать смешение переменных приведу такой синтетический пример (все подписи к полям выкинул для наглядности).
<form name="login" method="post" action="/test?a=555&amp;b=666">
<input type="text" name="login" id="login"/>
<input type="password" id="password" name="password"/>
<input type="submit"/>
</form>
Как видите, данные с формы отправляются методом POST по URL /test?a=555&b=666. В итоге в обработчике /test, выполнив web.input() мы получим словарь вида:
{
'name':'testname',
'password':'testpass',
'a':'555'
'b':'666'
}
Конечно, в данном случае мы сами смешали переменные, но согласитесь, что обрабатывая результат заполнения формы, мы ожидаем только переменные из POST, так давайте только их и обрабатывать, просто на всякий случай, чтобы спать спокойно. Как часто бывает в мире OpenSource лучшая документация это код. В моём недолгом освоении web.py это правило сработывало неоднократно, так получилось и на этот раз. Код web.input() находится в web/webapi.py, при желании можете посмотреть сами, но результатом моих поисков стало следующее знание: web.input(_method='post') и web.input(_method='get') выдадут только переменные переданные методом POST и GET соответственно. На этом всё. В следующем сообщении расскажу про валидатор форм, выполненный ввиде декоратора цельнопизженного из Pylons. Правда эта конструкция в моих руках может и не взлететь, тогда расскажу о чем-нибудь другом.