Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 16925 / 522 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 9:

Сетевые приложения на Python

Возможности urllib2

Функциональности модулей urllib и urlparse хватает для большинства задач, которые решают сценарии на Python как web-клиенты. Тем не менее, иногда требуется больше. На этот случай можно использовать модуль для работы с протоколом HTTP - httplib - и создать собственный класс для HTTP-запросов (в лекциях модуль httplib не рассматривается). Однако вполне вероятно, что нужная функциональность уже имеется в модуле urllib2.

Одна из полезных возможностей этих модулей - доступ к web-объектам, требующий авторизации. Ниже будет рассмотрен пример, который не только обеспечит доступ с авторизацией, но и обозначит основную идею модуля urllib2: использование обработчиков (handlers), каждый из которых решает узкую специфическую задачу.

Следующий пример показывает, как создать собственный открыватель URL с помощью модуля urllib2 (этот пример взят из документации по Python):

import urllib2

# Подготовка идентификационных данных
authinfo = urllib2.HTTPBasicAuthHandler()
authinfo.add_password('My page', 'localhost', 'user1', 'secret')

# Доступ через прокси
proxy_support = urllib2.ProxyHandler({'http' : 'http://localhost:8080'})

# Создание нового открывателя с указанными обработчиками
opener = urllib2.build_opener(proxy_support,
                              authinfo, 
                              urllib2.CacheFTPHandler)
# Установка поля с названием клиента
opener.addheaders = [('User-agent', 'Mozilla/5.0')]

# Установка нового открывателя по умолчанию
urllib2.install_opener(opener)

# Использование открывателя
f = urllib2.urlopen('http://localhost/mywebdir/')
print f.read()[:100]

В этом примере получен доступ к странице, которую охраняет mod_python (см. предыдущую лекцию). Первый аргумент при вызове метода add_password() задает область действия (realm) идентификационных данных (он задан директивой AuthName "My page" в конфигурации web-сервера). Остальные параметры достаточно понятны: имя хоста, на который нужно получить доступ, имя пользователя и его пароль. Разумеется, для корректной работы примера нужно, чтобы на локальном web-сервере был каталог, требующий авторизации.

В данном примере явным образом затронуты всего три обработчика: HTTPBasicAuthHandler, ProxyHandler и CacheFTPHandler. В модуле urllib2 их более десятка, назначение каждого можно узнать из документации к используемой версии Python. Есть и специальный класс для управления открывателями: OpenerDirector. Именно его экземпляр создала функция urllib2.build_opener().

Модуль urllib2 имеет и специальный класс для воплощения запроса на открытие URL. Называется этот класс urllib2.Request. Его экземпляр содержит состояние запроса. Следующий пример показывает, как получить доступ к каталогу с авторизацией, используя добавление заголовка в HTTP-запрос:

import urllib2, base64
req = urllib2.Request('http://localhost/mywebdir')
b64 = base64.encodestring('user1:secret').strip()
req.add_header('Authorization', 'Basic %s' % b64)
req.add_header('User-agent', 'Mozilla/5.0')
f = urllib2.urlopen(req)
print f.read()[:100]

Как видно из этого примера, ничего загадочного в авторизации нет: web-клиент вносит (закодированные base64) идентификационные данные в поле Authorization HTTP-запроса.

Примечание:

Приведенные два примера почти эквивалентны, только во втором примере прокси-сервер не назначен явно.

Андрей Егоров
Андрей Егоров

def bin(n):

"""Цифры двоичного представления натурального числа """

if n == 0:

   return []

n, d = divmod(n, 2)

return bin(n) + [d]

print bin(69)

Что значит здесь return[] ? Возвращает список? Непонятно какой список? Откуда он? 

 

 

Асмик Гаряка
Асмик Гаряка

Почему при вычислении рейтинга не учитывается уровень, как описано? Для всех курсов У=1, хотя для Специалист должно быть 2.

Максим Захолодилов
Максим Захолодилов
Россия
Анастасия Пашинина
Анастасия Пашинина
Россия, Москва