|
|||
CGI: пишем простой сайт на Python. Часть 3: Пример приложенияСтр 1 из 2Следующая ⇒ CGI: пишем простой сайт на Python. Часть 3: Пример приложения
Чтобы работать с пользовательскими данными, нужно где-то эти данные сохранять. Самый простой (но далеко не самый изящный и безопасный) - хранение данных в файлах. Более продвинутый способ - хранение в базе данных. Мы здесь остановимся на первом способе, как на самом простом. Собственно, ничего нового здесь объясняться не будет. Работу с файлами вы уже знаете, обрабатывать формы уже умеете. Сегодня мы напишем прототип приложения типа "твиттер". Данные в файлах будем хранить в json. Создадим 2 файла: один будет отвечать за обработку данных, вводимых пользователем, второй - вспомогательный модуль, который упростит код первого. cgi-bin/wall.py: #!/usr/bin/env python3 # -*- coding: utf-8 -*-
import cgi import html import http.cookies import os
from _wall import Wall wall = Wall()
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) session = cookie.get("session") if session is not None: session = session.value user = wall.find_cookie(session) # Ищем пользователя по переданной куке
form = cgi.FieldStorage() action = form.getfirst("action", "")
if action == "publish": text = form.getfirst("text", "") text = html.escape(text) if text and user is not None: wall.publish(user, text) elif action == "login": login = form.getfirst("login", "") login = html.escape(login) password = form.getfirst("password", "") password = html.escape(password) if wall.find(login, password): cookie = wall.set_cookie(login) print('Set-cookie: session={}'.format(cookie)) elif wall.find(login): pass # А надо бы предупреждение выдать else: wall.register(login, password) cookie = wall.set_cookie(login) print('Set-cookie: session={}'.format(cookie))
pattern = ''' <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Стена</title> </head> <body> Форма логина и регистрации. При вводе несуществующего имени зарегистрируется новый пользователь. <form action="/cgi-bin/wall.py"> Логин: <input type="text" name="login"> Пароль: <input type="password" name="password"> <input type="hidden" name="action" value="login"> <input type="submit"> </form>
{posts}
{publish} </body> </html> '''
if user is not None: pub = ''' <form action="/cgi-bin/wall.py"> <textarea name="text"></textarea> <input type="hidden" name="action" value="publish"> <input type="submit"> </form> ''' else: pub = ''
print('Content-type: text/html\n')
print(pattern.format(posts=wall.html_list(), publish=pub)) Здесь мы используем форматирование строк для формирования страницы (кстати, это первый шаг на пути к созданию собственного шаблонизатора).
cgi-bin/_wall.py (здесь определены функции publish, login и другие): #!/usr/bin/env python3 # -*- coding: utf-8 -*-
|
|||
|