Поддержка протоколов Internet

advertisement
Поддержка протоколов
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'
Download