Установка
Для нормальной работы программ с web.py необходимы сам web.py и Cheetah.
Скачайте в один и тот же каталог следующие файлы:
- http://webpy.org/web.py
- http://easynews.dl.sourceforge.net/sourceforge/cheetahtemplate/Cheetah-1.0.tar.gz
после этого разожмите последний архив, скопируйте содержимое папки src в каталог Cheetah
и удалите ненужное, например так:
$ tar xzf Cheetah-1.0.tar.gz
$ mv Cheetah-1.0/src Cheetah
$ rm Cheetah-1.0* -rf
Таким образом мы подготовили среду для разработки.
Поддержка URL
Откройте в текстовом редакторе новый файл, назвав его ну... скажем... poluekt.py.
Шучу. Удобнее будет code.py. Впишите в него главную строку:
import web
так импортируются функции фреймворка web.py.
urls = (
'/', 'view'
)
Это ваш лист соответствия urlов и функций. Первая часть - регулярное выражение с помощью которого определяется путь. Например '/', или '/help/faq', или даже /item/(\d+). Строка d+ обозначает "некоторая ненулевая последовательность цифр", подробнее смотрите об этом в Python Regex HowTo. Скобки вокруг \d+ нужны для того, чтобы удобно исользовать эти цифры в дальнейшем. Вторая часть - имя класса, которому будет передан запрос. Например, 'view', 'welcomes.hello' (то есть класс hello из модуля welcomes) или 'get_\1'. \1 заменяется на первое совпадание выделенного регулярного выражения. Все остальные элементы выделенного регулярного выражения (помните (\d+)? ) передаются в класс-обработчик.
class view:
def GET(self):
Это класс view, с определенной в нем функцией GET. Как вы наверняка догадались, GET вызывается когда кто-либо вызывает метод HTTP GET на ваш URL (например просто открыв страницу в браузере).
print "Превед, Орлы!!!"
Вывести постетителю русский вариант строки "Hello World!".
web.internalerror = web.debugerror
В этой строке мы говорим web.py, что надо показывать отладочную информацию в случае ошибки. Когда вы будете запускать ваш сервис в общий доступ, не забудьте закоментировать эту строку.
if __name__ == '__main__': web.run(urls, web.reloader)
Этот страшный набор букв говорит, что нужно запустить наше веб-приложение при исполнении файла.
Первый аргумент вызова web.run, urls, это тот самый список-соответствие url'ов и функций, описаный выше.
Второй аргумент -- очень удобная опция, заставляющая web.py перезагружать исполняемый файл каждый раз, когда в нем что-то изменено. Постарайтесь не забыть убрать и этот параметр перед публичным запуском вашей страницы.
Кстати, если вместо web.reloader вписать web.profiler можно будет узнавать сколько времени занимает та или иная функция при выдаче страницы. Говоря человеческим языком, это профайлер, то есть средство, помогающее оптимизировать скорость работы скрипта.
Настало время запускать наше приложение. Просто выполните команду
$ python code.py
и приложение запустит маленький веб-сервер, который будет отвечать на адрес http://localhost:8080/.
Вы можете изменить порт по умолчанию на другой, указав номер порта в качестве параметра, например так:
$ python code.py 6060
Вы также можете запускать этот скрипт как CGI или FastCGI скрипт -- он автоматически распознает подобные вещи.
На самом деле web.py использует WSGI, так что ваше приложение может работать с любым интерфейсом к web для
python, в том числе scgi и mod_python.
Теперь, если вы откроете свой браузер на ссылке http://localhost:8080/, ваше приложение поздаровается с вами.
Шаблоны
Создайте новый каталог templates. Внутри него создайте новый файл с расширением .html, например view.html
с таким содержимым:
#if $name
Здравствуй, здравствуй, $name. Как твой заворот кишок?
#else
Снова-здарова, Орлы!!!!
#end if
Вернемся к файлу code.py. Замените функцию view.GET на такую:
name = 'Анатолий Владимирович'
web.render('view.html')
Теперь, если вы зайдете по той же ссылке вы увидите немного другое преветствие.
Эти шаблоны и есть Cheetah Templates.
Все важные элементы шаблонов находятся на одной удобной странице Cheetah Templates (английская). В общих чертах эти шаблоны работают так, как будто вы встраиваете ваш код на Python внутрь HTML (или что вы там пытаетесь написать).
Внимание: есть планы по замене Cheetah на новую, упрощенную систему шаблонов. Более легковесную и чуть более мощную. Большая часть синтаксиса будет похожа, так что пока можно продолжать использовать Cheetah.
Забавные URLы
Поменяйте немного список ссылок, чтобы он выглядел так:
'/(.*)', 'view'
Теперь придется поменять определение функции view.GET на такое:
def GET(self, name):
и удалить строчку, где переопределяется переменная name - она больше не нужна.
Теперь, если вместо / вы пойдете по ссылке http://localhost:8080/Joe, программа
решит что вы Joe. Таким образом выделенное выражение (.*) передалось в функцию в качестве первого параметра - name.
Базы Данных
Ниже строки с web.run впишите:
web.db_parameters = dict(dbn='mysql', user='me', pw='pass', db='dbname')
конечно же вам нужно изменить эти параметры, чтобы иметь доступ к базе данных.
Создайте простую табличку, например такую:
CREATE TABLE todo (
id unique AUTO_INCREMENT primary key,
title text,
created timestam default now(),
);
и вставьте в нее строчку с примером:
INSERT INTO todo (title) VALUES ('Заучить web.py');
В code.py в верхней строке функции view.GET добавьте:
todos = web.select("todo")
Черт, теперь выкиньте все из view.html и впишите куда-нибудь в серединку:
<ul>
#for todo in $todos
<li id="t$todo.id">$todo.title</li>
#end for
</ul>
Посетив вашу уже немаленькую веб-страничку, вы увидите один элемент: 'Заучить web.py'.
Допишите в конец этого же файла:
<form method="post" action="add">
<p>
<input type="text" name="title" />
<input type="submit" value="Add" />
</p>
</form>
Измените ваш список ссылок urls вот так:
'/', 'view',
'/add', 'add'
Верните обратно количество view.GET, мне надоело играть с именами:
def GET(self):
А ниже класса view добавьте еще один - add:
class add:
def POST(self):
i = web.input()
n = web.insert('todo', title=i.title)
web.seeother('./#t'+str(n))
web.insert возвращает идентификатор свежевставленного элемента, а команда web.seeother пересылает пользователя на этот новый элемент.
Еще одна штука - вот в строчке i = web.input мы получили в переменной i все параметры, переданные из формы пользователем. Красиво и просто, правда?
В темпе вальса: web.transact() начинает транзакцию, web.commit() коммитит её, web.rollback(), что логично, откатывает её. web.update работает точно также как web.insert за исключением того, что вместо возврата нового элемента она обновляет уже сохраненный элемент по его id (или по строке, которая подставляется в WHERE запроса)
В общем это всё к чему - теперь вы можете добавлять новые элементы в список.
Объект-хранилище
И web.input, и web.query, а также большинство других функций web.py возвращают в качестве результата объект-хранилище. Этот объект похож на стандартный dictionary языка python, однако позволяет обращаться к элементам не только через d['figna'], но и d.figna, что на 3 символа короче :)
Куки
А также спамы и трояны...
Куки работают также, как и web.input. web.cookies() возвращает объект-хранилище с набором кук, пришедших от браузера. Вы можете изменять их функцией web.setcookie(name, value, expires=""), где name - имя куки, value - значение, а expires, соответственно, срок истечения действия куки.
И web.input, и web.cookies в качестве параметра принимают названия и пары ключ-значение.
Например, вызвав web.input('color', times=1) вы поймаете ошибку, если в форме не окажется элемента color, или если в элементе times не будет единица.
Типовой паттерн использования:
try:
i = web.input('foo', bar=2)
except KeyError:
return web.badrequest()
Пока всё, ребята. В следующий раз я раскажу вам про модуль forms.
Комментарии? Вопросы? Мнения? Предложения? мой адрес - bobuk@justos.org
last updated 1 year ago
#
Shegroaned as he was the teenyboppers. You want to her clit. He quickly <a href= http://www.forumromanum.de/member/forum/forum.php?USER=user_443651 >amateur milf</a> found.
26 days ago # reply