Литмир - Электронная Библиотека
A
A

Заключение

В этой лекции были рассмотрены варианты обработки текстовой информации трех достаточно распространенных форматов: CSV, Unix mailbox и XML. Конечно, форматов данных, даже основанных на тексте, гораздо больше, однако то, что было представлено, поможет быстрее разобраться с любым модулем для обработки формата или построить свой модуль так, чтобы другие могли понять ваши намерения.

8. Лекция: Разработка Web–приложений.

Одна из главных сфер применения языка Python — web–приложения — представляется в этой лекции на конкретных примерах. Кроме того, делается акцент на типичных слабых местах безопасности web–приложений.

Под web–приложением будет пониматься программа, основной интерфейс пользователя которой работает в стандартном WWW–браузере под управлением HTML и XML–документов. Для улучшение качества интерфейса пользователя часто применяют JavaScript, однако это несколько снижает универсальность интерфейса. Следует заметить, что интерфейс можно построить на Java–или Flash–апплетах, однако, такие приложения сложно назвать web–приложениями, так как Java или Flash могут использовать собственные протоколы для общения с сервером, а не стандартный для WWW протокол HTTP.

При создании web–приложений стараются отделить Форму (внешний вид, стиль), Содержание и Логику обработки данных. Современные технологии построения web–сайтов дают возможность подойти достаточно близко к этому идеалу. Тем не менее, даже без применения многоуровневых приложений можно придерживаться стиля, позволяющего изменять любой из этих аспектов, не затрагивая (или почти не затрагивая) двух других. Рассуждения на эту тему будут продолжены в разделе, посвященном средам разработки.

CGI–сценарии

Классический путь создания приложений для WWW — написание CGI–сценариев (иногда говорят — скриптов). CGI (Common Gateway Interface, общий шлюзовой интерфейс) - это стандарт, регламентирующий взаимодействие сервера с внешними приложениями. В случае с WWW, web–сервер может направить запрос на генерацию страницы по определенному сценарию. Этот сценарий, получив на вход данные от web–сервера (тот, в свою очередь, мог получить их от пользователя), генерирует готовый объект (изображение, аудиоданные, таблицу стилей и т.п.).

При вызове сценария Web–сервер передает ему информацию через стандартный ввод, переменные окружения и, для ISINDEX, через аргументы командной строки (они доступны через sys.argv).

Два основных метода передачи данных из заполненной в браузере формы Web–серверу (и CGI–сценарию) - GET и POST. В зависимости от метода данные передаются по–разному. В первом случае они кодируются и помещаются прямо в URL, например: http://host/cgi–bin/a.cgi?a=1&b=3. Сценарий получает их в переменной окружения с именем QUERY_STRING. В случае метода POST они передаются на стандартный ввод.

Для корректной работы сценарии помещаются в предназначенный для этого каталог на web–сервере (обычно он называется cgi–bin) или, если это разрешено конфигурацией сервера, в любом месте среди документов HTML. Сценарий должен иметь признак исполняемости. В системе Unix его можно установить с помощью команды chmod a+x.

Следующий простейший сценарий выводит значения из словаря os.environ и позволяет увидеть, что же было ему передано:

Листинг

#!/usr/bin/python

import os

print ""«Content–Type: text/plain

%s»"" % os.environ

С помощью него можно увидеть установленные Web–сервером переменные окружения. Выдаваемый CGI–сценарием web–серверу файл содержит заголовочную часть, в которой указаны поля с мета–информацией (тип содержимого, время последнего обновления документа, кодировка и т.п.).

Основные переменные окружения, достаточные для создания сценариев:

Листинг

QUERY_STRING

Строка запроса.

Листинг

REMOTE_ADDR

IP–адрес клиента.

Листинг

REMOTE_USER

Имя клиента (если он был идентифицирован).

Листинг

SCRIPT_NAME

Имя сценария.

Листинг

SCRIPT_FILENAME

Имя файла со сценарием.

Листинг

SERVER_NAME

Имя сервера.

Листинг

HTTP_USER_AGENT

Название броузера клиента.

Листинг

REQUEST_URI

Строка запроса (URI).

Листинг

HTTP_USER_AGENT

Имя сервера.

Листинг

HTTP_ACCEPT_LANGUAGE

Желательный язык документа.

Вот что может содержать словарь os.environ в CGI–сценарии:

Листинг

{

'DOCUMENT_ROOT': '/var/www/html',

'SERVER_ADDR': '127.0.0.1',

'SERVER_PORT': '80',

'GATEWAY_INTERFACE': 'CGI/1.1',

'HTTP_ACCEPT_LANGUAGE': 'en–us, en;q=0.50',

'REMOTE_ADDR': '127.0.0.1',

'SERVER_NAME': 'rnd.onego.ru',

'HTTP_CONNECTION': 'close',

'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i586; en–US;

rv:1.0.1) Gecko/20021003',

'HTTP_ACCEPT_CHARSET': 'ISO–8859–1, utf–8;q=0.66, *;q=0.66',

'HTTP_ACCEPT': 'text/xml,application/xml,application/xhtml+xml,

text/html;q=0.9,text/plain;q=0.8,video/x–mng,image/png,image/jpeg,

image/gif;q=0.2,text/css,*/*;q=0.1',

'REQUEST_URI': '/cgi–bin/test.py?a=1',

'PATH': '/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin',

'QUERY_STRING': 'a=1&b=2',

'SCRIPT_FILENAME': '/var/www/cgi–bin/test.py',

'HTTP_KEEP_ALIVE': '300',

'HTTP_HOST': 'localhost',

'REQUEST_METHOD': 'GET',

'SERVER_SIGNATURE': 'Apache/1.3.23 Server at rnd.onego.ru Port 80',

'SCRIPT_NAME': '/cgi–bin/test.py',

'SERVER_ADMIN': 'root@localhost',

'SERVER_SOFTWARE': 'Apache/1.3.23 (Unix) (Red–Hat/Linux)

mod_python/2.7.8 Python/1.5.2 PHP/4.1.2',

'SERVER_PROTOCOL': 'HTTP/1.0',

'REMOTE_PORT': '39251'

}

Следующий CGI–сценарий выдает черный квадрат (в нем используется модуль Image для обработки изображений):

Листинг

#!/usr/bin/python

import sys

print ""«Content–Type: image/jpeg

"""

import Image

i = Image.new(«RGB», (10,10))

i.im.draw_rectangle((0,0,10,10), 1)

i.save(sys.stdout, «jpeg»)

Модуль cgi

В Python имеется поддержка CGI в виде модуля cgi. Следующий пример показывает некоторые из его возможностей:

Листинг

#!/usr/bin/python

# -*- coding: cp1251 -*-import cgi, os

# анализ запроса

f = cgi.FieldStorage()

if f.has_key(«a»):

a = f[«a»].value

else:

a = «0»

# обработка запроса

b = str(int(a)+1)

mytext = open(os.environ[«SCRIPT_FILENAME»]).read()

mytext_html = cgi.escape(mytext)

# формирование ответа

print ""«Content–Type: text/html

<html><head><title>Решение примера: %(b)s = %(a)s + 1</title></head>

<body>

%(b)s

<table width=«80%%"><tr><td>

<form action=«me.cgi» method=«GET»>

<input type=«text» name=«a» value=«0» size=«6»>

<input type=«submit» name=«b» value=«Обработать»>

</form></td></tr></table>

<pre>

%(mytext_html)s

</pre>

</body></html>""" % vars()

В этом примере к заданному в форме числу прибавляется 1. Кроме того, выводится исходный код самого сценария. Следует заметить, что для экранирования символов >, <, & использована функция cgi.escape(). Для формирования Web–страницы применена операция форматирования. В качестве словаря для выполнения подстановок использован словарь vars() со всеми локальными переменными. Знаки процента пришлось удвоить, чтобы они не интерпретировались командой форматирования. Стоит обратить внимание на то, как получено значение от пользователя. Объект FieldStorage «почти» словарь, с тем исключением, что для получения обычного значения нужно дополнительно посмотреть атрибут value. Дело в том, что в сценарий могут передаваться не только текстовые значения, но и файлы, а также множественные значения с одним и тем же именем.

35
{"b":"429288","o":1}