Хелпикс

Главная

Контакты

Случайная статья





CGI: пишем простой сайт на Python. Часть 3: Пример приложения



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 -*-

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.