2. Что мы научимся делать?
Обрабатывать GET и POST запросы
Выводить HTML при помощи шаблонов
Хранить данные в СУБД
Типичные задачи
Отображение списка объектов
Изменение (редактирование) объектов
Wizards: последовательности страниц
3. Языки и технологии
Статические (+/-):
СС++ модули к Web серверам.
Java – Servlets, ApplicationServers
Динамически (+/-):
Perl – CGI, mod_perl, PSGI
PHP – mod_php, FastCGI (FPM)
Ruby – rack, свой сервер (mongrel)
Python – WSGI, свой сервер (Tornado)
JavaScript – свой сервер (NodeJS)
4. CGI скрипт
#!/usr/bin/python2.7
print "Content-type: text/html"
print "Status: 200"
print ""
print "<h1>Hello, world!</h1>"
import os
import sys
for k, v in os.environ.items():
print "%s = %s<br>" % (k, v)
print >> sys.stderr, "Nice to meet you"
6. Передача GET параметров
<a href=”/hello.cgi?name=me&greeting=hello”/>Say
hello</a>
QUERY_STRING=name=me&greeting=hello
get_params = {}
qs = os.environ['QUERY_STRING']
for pair in qs.split('&'):
key, value = pair.split('=')
get_params[key] = value
18. SQL запросы
INSERT INTO users (name, age) VALUES
('petr', 10), ('masha', 25);
UPDATE users SET age = 10 WHERE name =
'petr';
DELETE FROM users WHERE name = 'masha';
SELECT * FROM users WHERE age > 10;
SELECT * FROM users WHERE name =
'masha';
SELECT max(age) FROM users;
19. Использование SQL в python
import MySQLdb
db = MySQLdb.connect(**options)
cursor = db.cursor()
cursor.execute(“update users set age = age+1 ”
”where name = ?”, form[“name”])
context = {}
cursor.execute(“select * from users”)
context['friends'] = cursor.fetchall()
cursor.execute(“select * from users where name = ?”,
form[“name”])
context['user'] = cursor.fetchone()
db.close()
20. Конфигурация приложений
1) hardcode. Настройки зашиты в код
приложения
2) script. Настройки представляют собой
скрипт на целевом ЯП
3) YAML, XML, ini, Config::Apache
4) Переменные, разделение на несколько
файлов
21. Задача №1. Листинг объектов
1) Параметры: фильтрация, сортировка, номер
страницы
2) /images/?order=created&page=3&limit=10
3) Результат работы скрипта: список объектов
для данной страницы и paginator
4) paginator – представляет положение в списке
страниц
22. import cgi
import psycopg2
import settings
db = psycopg2.connect(**settings.db)
cursor = db.cursor()
form = cgi.FieldStorage()
order = form.getfirst('order', 'created')
if order not in ('created', 'size'): raise BaseException('oops')
page = form.getfirst('page', 1)
limit = form.getfirst('limit', 10)
sql = 'select * from images order by %s limit %d offset %d' %
(order, limit, limit * (page – 1))
25. Задача № 2. Изменение объекта
1) Два режима работы: отображение формы и
обновление объекта
2) Разделение по методу HTTP (GET | POST).
Кеширование запросов
3) Использование спец. параметра (action)
4) Отображение ошибок и результата действия
26. import cgi; import psycopg2; import settings; import os
db = psycopg2.connect(**settings.db)
cursor = db.cursor()
form = cgi.FieldStorage()
if os.environ['HTTP_METHOD'] == 'POST”:
try:
cursor.execute('update users set name = ? where id = ?', form['name'], form['id'])
redirect('/cgi-bin/object.cgiid=%s&res=updated' % form['id'])
catch BaseException, e:
redirect('/cgi-bin/object.cgi?id=%s&fail=fail' % form['id'])
else:
context = {}
cursor.execute('select * from users where id = ?', form['id'])
context['object'] = cursor.fetchone()
render('object.html', context)
28. Best Practice
1) Разделять методы GET – получение, POST –
обновление данных
2) Сообщать об ошибках и успехе
3) Проверять данные пользователя
а) на сервере – безопасность программы
б) на клиенте – удобство пользователя
4) Выделять неправильно введеные поля
29. Задача № 3. Wizard
1) Statefull vs Stateless.
2) Как передать данные между страницами?
выбор товара → информация о клиенте
→ дата и место доставки → подтверждение
3) Варианты:
- через URL
- через скрытые поля
- через Cookie
- через сессии
35. Кеширование
Что такое кеширование ? Виды кешей:
1) HTTP cache - сокращает загрузку статики
2) proxy cache – кеш страницы целиком
(либо части, подключаемой через ssi)
3) buffer cache – кеширование данных в OS
4) memcached – распределенный кеш в памяти
5) генерация статических файлов
6) отложенное выполнение. crond.
36. Домашняя работа
1) реализовать calc_paginator
2) написать cgi скрипт для проверки. Список
объектов – числа Фибоначчи до 10000
1) реализовать функцию redirect
2) написать cgi скрипт для проверки.
Например аналог bit.ly со статическими
настройками.