280 likes | 414 Views
Поддержка протоколов Internet. c gi - протокол CGI используемый для интерпретации форм HTML на стороне сервера. FastCGI - протокол взаимодействия вебсервера и приложения, дальнейшее развитие технологии CGI . u rllib - чтение произвольных ресурсов по URL. u rlparse - операции над URL.
E N D
Поддержка протоколов 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&name=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 убирает это ограничение, сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на запуск новых процессов.
urllib — чтение произвольных ресурсов по URL
Объекты, реализующие чтение ресурса, помимо 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.musi-cal.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.musi-cal.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#fragment’ дает: ‘(scheme, netloc, path, parameters, query, fragment)’.
>>> import urlparse >>> urlparse.urlparse( ... 'http://www.cwi.nl:80/%7Eguido/Python.html') 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'