Поддержка протоколов Internet cgi - протокол CGI используемый для интерпретации форм HTML на стороне сервера. cgi - протокол CGI используемый для интерпретации форм HTML на стороне сервера. FastCGI - протокол взаимодействия вебсервера и приложения, дальнейшее развитие технологии CGI. FastCGI - протокол взаимодействия вебсервера и приложения, дальнейшее развитие технологии CGI.CGI urllib - чтение произвольных ресурсов по URL. urllib - чтение произвольных ресурсов по URL. urlparse - операции над URL. urlparse - операции над URL.
cgi - протокол CGI CGI-программа вызывается HTTP- сервером, обычно для обработки данных. HTTP-сервер помещает информацию о запросе в переменные окружения программы, выполняет программу и пересылает клиенту его вывод. CGI-программа вызывается HTTP- сервером, обычно для обработки данных. HTTP-сервер помещает информацию о запросе в переменные окружения программы, выполняет программу и пересылает клиенту его вывод.
HTTP - протокол передачи гипертекста. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URL. HTTP - протокол передачи гипертекста. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URL.
Всё программное обеспечение для работы с протоколом HTTP разделяется на три больших категории: Серверы как основные поставщики услуг хранения и обработки информации (обработка запросов). Серверы как основные поставщики услуг хранения и обработки информации (обработка запросов). Клиенты конечные потребители услуг сервера (отправка запроса). Клиенты конечные потребители услуг сервера (отправка запроса). Прокси для выполнения транспортных служб. Прокси для выполнения транспортных служб.
TCP/IP Стек протоколов TCP/IP набор сетевых протоколов разных уровней, используемых в сетях. Протоколы работают друг с другом в стеке. Стек протоколов TCP/IP набор сетевых протоколов разных уровней, используемых в сетях. Протоколы работают друг с другом в стеке. сетевых протоколовстекесетевых протоколовстеке Уровни стека TCP/IP: Уровни стека TCP/IP: Прикладной (HTTP) Прикладной (HTTP) Представительский Представительский Сеансовый Сеансовый Транспортный (TCP) Транспортный (TCP) Сетевой (IP) Сетевой (IP) Канальный Канальный Физический Физический
Для передачи переменных используется два HTTP метода: GET и POST Метод GET отправляет скрипту всю собранную информацию формы как часть URL: e=komtet Метод GET отправляет скрипту всю собранную информацию формы как часть URL: e=komtet e=komtet e=komtet Метод POST передает данные таким образом, что пользователь сайта уже не видит передаваемые скрипту данные: Метод POST передает данные таким образом, что пользователь сайта уже не видит передаваемые скрипту данные:
Вывод CGI-программы должен состоять из двух частей, разделенных пустой строкой. Первая часть содержит набор заголовков, которые описывают тип данных, следующих во втором разделе. #вначале выводятся заголовки print "Content-Type: text/html" # Определение типа HTML print # Пустая строка: конец заголовков # теперь выводим основной текст в формате HTML print " " print " Вывод CGI-программы " print " " print " Это моя первая CGI-программа " print "Привет всему миру!" print " "
основная область применения CGI – для обработки информации из форм. передача параметров в CGI скрипт осуществляется двумя методами: передача параметров в CGI скрипт осуществляется двумя методами: прямой передачей параметров в имени URL в формате ние_параметра1&имя_параметра2=значение 2... прямой передачей параметров в имени URL в формате ние_параметра1&имя_параметра2=значение 2... передача параметров через HTML форму. передача параметров через HTML форму.
во втором случае необходимо применение модуля cgi: import cgi import cgi #чтобы включить обработку ошибок : import cgitb; cgitb.enable() import cgitb; cgitb.enable() #чтобы ошибки передавались в log файл: import cgitb; cgitb.enable(display=0, logdir="/tmp") import cgitb; cgitb.enable(display=0, logdir="/tmp")
Модуль предоставляет средства для ведения log-файла: Модуль предоставляет средства для ведения log-файла: Logfile - определяет имя log-файла. Logfile - определяет имя log-файла. Logfp - файловый объект, соответствующий log-файлу. Logfp - файловый объект, соответствующий log-файлу. log() - записывает строку в log-файл log() - записывает строку в log-файл
Класс FieldStorage - содержит в себе переданную в форме информацию. Этот класс представляет из себя словарь. Класс FieldStorage - содержит в себе переданную в форме информацию. Этот класс представляет из себя словарь. Чтобы FieldStorage включал все переменные формы: Чтобы FieldStorage включал все переменные формы: form = cgi.FieldStorage(keep_blank_values=true) form = cgi.FieldStorage(keep_blank_values=true)
пример CGI-программы, который проверяет, чтобы были заполнены поля name и addr: import cgi print """\ Content-Type: text/html """ form = cgi.FieldStorage() if form.has_key("name") and form.has_key("addr"): print """\ eIN: %s aAOAO: %s """ else: print """\ Ошибка Введите, пожалуйста, имя и адрес. """ print """\ """
Если возможно присутствие нескольких полей с одинаковым именем, используйте встроенную функцию 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. test() - реализует готовую CGI- программу, предназначена для тестирования: выводит минимальный HTTP-заголовок и всю переданную программе информацию в формате HTML.
FastCGI По сравнению с CGI является более производительным и безопасным. По сравнению с CGI является более производительным и безопасным. FastCGI ликвидирует множество ограничений CGI- программ. Проблема CGI-программ в том, что они должны быть перезапущены веб-сервером при каждом запросе, что приводит к понижению производительности. FastCGI ликвидирует множество ограничений CGI- программ. Проблема CGI-программ в том, что они должны быть перезапущены веб-сервером при каждом запросе, что приводит к понижению производительности.CGIвеб-серверомCGIвеб-сервером FastCGI убирает это ограничение, сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на запуск новых процессов. FastCGI убирает это ограничение, сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на запуск новых процессов.
Объекты, реализующие чтение ресурса, помимо read(), readline(), readlines(), fileno() и close() имеют методы: info() - при использовании протокола HTTP этот объект содержит информацию обо всех заголовках. info() - при использовании протокола HTTP этот объект содержит информацию обо всех заголовках. geturl() - возвращает истинный URL ресурса. geturl() - возвращает истинный URL ресурса.
Функции urlopen() и urlretrieve() создают и используют экземпляр класса FancyURLopener. Созданный объект сохраняется для дальнейшего использования этими функциями. Если нужен более тонкий контроль, используются: Функции urlopen() и urlretrieve() создают и используют экземпляр класса FancyURLopener. Созданный объект сохраняется для дальнейшего использования этими функциями. Если нужен более тонкий контроль, используются: URLopener() - базовый класс, реализующий чтение ресурсов. URLopener() - базовый класс, реализующий чтение ресурсов. FancyURLopener() - предоставляет обработку HTTP-ответов FancyURLopener() - предоставляет обработку HTTP-ответов
import urllib import urllib class AppURLopener(urllib.FancyURLopener): class AppURLopener(urllib.FancyURLopener): version = "App/1.7" version = "App/1.7" urllib._urlopener = AppURLopener() urllib._urlopener = AppURLopener()
Следующий пример использует метод GET для загрузки ресурса по протоколу HTTP: import urllib import urllib params = urllib.urlencode({'spam': 1, \ 'eggs': 2, \ params = urllib.urlencode({'spam': 1, \ 'eggs': 2, \ 'bacon': 0}) 'bacon': 0}) f = urllib.urlopen(" cal.com/cgi-bin/query?%s" % params) f = urllib.urlopen(" cal.com/cgi-bin/query?%s" % params) print f.read() print f.read()
И тот же самый ресурс, используя метод POST: import urllib import urllib params = urllib.urlencode({'spam': 1, \ params = urllib.urlencode({'spam': 1, \ 'eggs': 2, \ 'eggs': 2, \ 'bacon': 0}) 'bacon': 0}) f = urllib.urlopen(" cal.com/cgi-bin/query", params) f = urllib.urlopen(" cal.com/cgi-bin/query", params) print f.read() print f.read()
import urllib import urllib params = urllib.urlencode({'text': 'elephant and giraf'}) params = urllib.urlencode({'text': 'elephant and giraf'}) print params print params f = urllib.urlopen(" + params) f = urllib.urlopen(" + params) print f.geturl() print f.geturl() #text=elephant+and+giraf # print f.read() #выведет код страницы print f.read() #выведет код страницы
urlparse операции над URL Этот модуль определяет средства для разбиения URL на компоненты, конструирования URL из компонент и преобразования относительных URL в абсолютные. Этот модуль определяет средства для разбиения URL на компоненты, конструирования URL из компонент и преобразования относительных URL в абсолютные.
urlparse() - возвращает кортеж из шести строк: идентификатор протокола, положение в сети, путь, параметры, строка запроса и идентификатор фрагмента. urlparse() - возвращает кортеж из шести строк: идентификатор протокола, положение в сети, путь, параметры, строка запроса и идентификатор фрагмента. То есть применение функции к строке общего вида: scheme://netloc/path;parameters?query#fr agment дает: То есть применение функции к строке общего вида: scheme://netloc/path;parameters?query#fr agment дает: (scheme, netloc, path, parameters, query, fragment).
>>> import urlparse >>> urlparse.urlparse(... ' ml') ParseResult(scheme='http', netloc=' path='/%7Eguido/Python.html', params='', query='', fragment='')
urlunparse() - восстанавливает и возвращает URL из компонент, переданных в кортеже. urlunparse() - восстанавливает и возвращает URL из компонент, переданных в кортеже. urljoin() Конструирует и возвращает полный URL, комбинируя базовый URL и относительный URL urljoin() Конструирует и возвращает полный URL, комбинируя базовый URL и относительный URL
import urlparse urlparse.urljoin(' … Python.html','FAQ.html') '