Поддержка протоколов Internet cgi - протокол CGI используемый для интерпретации форм HTML на стороне сервера. FastCGI - протокол взаимодействия вебсервера и приложения, дальнейшее развитие технологии CGI. urllib - чтение произвольных ресурсов по URL. urlparse - операции над URL. cgi - протокол CGI CGI-программа вызывается HTTPсервером, обычно для обработки данных. HTTP-сервер помещает информацию о запросе в переменные окружения программы, выполняет программу и пересылает клиенту его вывод. HTTP - протокол передачи гипертекста. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URL. Всё программное обеспечение для работы с протоколом HTTP разделяется на три больших категории: Серверы как основные поставщики услуг хранения и обработки информации (обработка запросов). Клиенты — конечные потребители услуг сервера (отправка запроса). Прокси для выполнения транспортных служб. TCP/IP Стек протоколов TCP/IP — набор сетевых протоколов разных уровней, используемых в сетях. Протоколы работают друг с другом в стеке. Уровни стека TCP/IP: Прикладной (HTTP) Представительский Сеансовый Транспортный (TCP) Сетевой (IP) Канальный Физический Для передачи переменных используется два HTTP метода: GET и POST Метод GET отправляет скрипту всю собранную информацию формы как часть URL: http://www.komtet.ru/script.php?login=admin&nam e=komtet Метод POST передает данные таким образом, что пользователь сайта уже не видит передаваемые скрипту данные: http://www.komtet.ru/script.php Вывод CGI-программы должен состоять из двух частей, разделенных пустой строкой. Первая часть содержит набор заголовков, которые описывают тип данных, следующих во втором разделе. #вначале выводятся заголовки print "Content-Type: text/html" # Определение типа HTML print # Пустая строка: конец заголовков # теперь выводим основной текст в формате HTML print "<html>" print "<title>Вывод CGI-программы</title>" print "<body>" print "<h1>Это моя первая CGI-программа</h1>" print "Привет всему миру!" print "</body>" print "</html>" основная область применения CGI – для обработки информации из форм. передача параметров в CGI скрипт осуществляется двумя методами: прямой передачей параметров в имени URL в формате “http://адрес_скрипта?имя_параметра1=значе ние_параметра1&имя_параметра2=значение2 ...” передача параметров через HTML форму. во втором случае необходимо применение модуля cgi: import cgi #чтобы включить обработку ошибок : import cgitb; cgitb.enable() #чтобы ошибки передавались в log файл: import cgitb; cgitb.enable(display=0, logdir="/tmp") Модуль предоставляет средства для ведения log-файла: Logfile - определяет имя log-файла. Logfp - файловый объект, соответствующий log-файлу. log() - записывает строку в log-файл Класс FieldStorage - содержит в себе переданную в форме информацию. Этот класс представляет из себя словарь. Чтобы FieldStorage включал все переменные формы: form = cgi.FieldStorage(keep_blank_values=true) пример CGI-программы, который проверяет, чтобы были заполнены поля ‘name’ и ‘addr’: import cgi print """\ Content-Type: text/html <html> <body>""" form = cgi.FieldStorage() if form.has_key("name") and form.has_key("addr"): print """\ <p>eIN: %s</p> <p>aAOAO: %s</p>""" else: print """\ <h1>Ошибка</h1> <p>Введите, пожалуйста, имя и адрес.</p>""" print """\ </body> </html>""" Если возможно присутствие нескольких полей с одинаковым именем, используйте встроенную функцию type() для определения типа: value = form.getvalue("username", "") if type(value) is type([]): # Заполнено несколько полей с именем пользователя usernames = ",".join(value) else: # Заполнено не более одного поля с именем пользователя usernames = value Если объект представляет загружаемый файл, при обращении к атрибуту value весь файл считывается в память в виде строки. Можно определить, представляет ли объект загружаемый файл, по значению атрибута filename или file: fileitem = form["userfile"] if fileitem.file: # Объект fileitem представляет загружаемый файл. # Подсчитываем строки, не сохраняя весь файл в памяти. linecount = 0 while 1: if fileitem.file.readline(): linecount += 1 else: break Дополнительные возможности модуля cgi test() - реализует готовую CGIпрограмму, предназначена для тестирования: выводит минимальный HTTP-заголовок и всю переданную программе информацию в формате HTML. FastCGI По сравнению с CGI является более производительным и безопасным. FastCGI ликвидирует множество ограничений CGIпрограмм. Проблема CGI-программ в том, что они должны быть перезапущены веб-сервером при каждом запросе, что приводит к понижению производительности. FastCGI убирает это ограничение, сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на запуск новых процессов. Объекты, реализующие чтение ресурса, помимо read(), readline(), readlines(), fileno() и close() имеют методы: info() - при использовании протокола HTTP этот объект содержит информацию обо всех заголовках. geturl() - возвращает истинный URL ресурса. Функции urlopen() и urlretrieve() создают и используют экземпляр класса FancyURLopener. Созданный объект сохраняется для дальнейшего использования этими функциями. Если нужен более тонкий контроль, используются: URLopener() - базовый класс, реализующий чтение ресурсов. FancyURLopener() - предоставляет обработку HTTP-ответов import urllib class AppURLopener(urllib.FancyURLopener): version = "App/1.7" urllib._urlopener = AppURLopener() Следующий пример использует метод GET для загрузки ресурса по протоколу HTTP: import urllib params = urllib.urlencode({'spam': 1, \ 'eggs': 2, \ 'bacon': 0}) f = urllib.urlopen("http://www.musical.com/cgi-bin/query?%s" % params) print f.read() И тот же самый ресурс, используя метод POST: import urllib params = urllib.urlencode({'spam': 1, \ 'eggs': 2, \ 'bacon': 0}) f = urllib.urlopen("http://www.musical.com/cgi-bin/query", params) print f.read() import urllib params = urllib.urlencode({'text': 'elephant and giraf'}) print params f = urllib.urlopen("http://yandex.ru/yandsearch?" + params) print f.geturl() #text=elephant+and+giraf #http://yandex.ru/yandsearch?text=elephant+and+giraf&lr=2 print f.read() #выведет код страницы urlparse — операции над URL Этот модуль определяет средства для разбиения URL на компоненты, конструирования URL из компонент и преобразования относительных URL в абсолютные. urlparse() - возвращает кортеж из шести строк: идентификатор протокола, положение в сети, путь, параметры, строка запроса и идентификатор фрагмента. То есть применение функции к строке общего вида: ’scheme://netloc/path;parameters?query#fr agment’ дает: ‘(scheme, netloc, path, parameters, query, fragment)’. >>> import urlparse >>> urlparse.urlparse( ... 'http://www.cwi.nl:80/%7Eguido/Python.ht ml') ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') urlunparse() - восстанавливает и возвращает URL из компонент, переданных в кортеже. urljoin() Конструирует и возвращает полный URL, комбинируя базовый URL и относительный URL import urlparse urlparse.urljoin('http://www.cwi.nl/%7Eguido/ … Python.html','FAQ.html') 'http://www.cwi.nl/%7Eguido/FAQ.html'