Кеннет Рейтц – Автостопом по Python (страница 32)
Этот выбор позволяет пользователю изменять объекты, но они становятся гораздо читабельнее, а дополнительная работа, выполняемая внутри PreparedRequest, позволяет исправить проблемы с регистром и использовать словарь вместо CookieJar (ищите оператор if isinstance()/else):
#
#… из файла models.py…
#
class PreparedRequest():
····#
····#…пропускаем все остальное…
····#
····def prepare_cookies(self, cookies):
········"""Подготавливает данные заданного HTTP cookie.
········Эта функция в итоге генерирует заголовок ''Cookie'' на основе
········предоставленных cookies с использованием cookielib. Из-за особенностей
········дизайна cookielib заголовок не будет сгенерирован повторно,
········если он уже существует. Это значит, что эта функция может быть
········вызвана всего один раз во время жизни объекта
········:class:'PreparedRequest <PreparedRequest>'. Любые последующие вызовы
········''prepare_cookies'' не возымеют эффекта, если только заголовок "Cookie"
········не будет удален заранее."""
········if isinstance(cookies, cookielib.CookieJar):
············self._cookies = cookies
········else:
············self._cookies = cookiejar_from_dict(cookies)
········cookie_header = get_cookie_header(self._cookies, self)
········if cookie_header is not None:
············self.headers['Cookie'] = cookie_header
Эти детали могут показаться незначительными, но они позволяют создать интуитивно понятный API.
Примеры из стиля Requests
Примеры стиля из Requests демонстрируют использование множеств (по нашему мнению, о них незаслуженно забывают!), мы также взглянем на модуль requests.status_codes module — он задействуется для упрощения стиля остального кода и позволяет избежать применения жестко закодированных кодов состояния HTTP в остальных местах.
Мы еще не приводили пример использования множеств в Python. Множества в Python ведут себя так же, как и множества в математике: вы можете выполнить операции вычитания, объединения (с помощью оператора ИЛИ) и пересечения (с помощью оператора И):
>>> s1 = set((7,6))
>>> s2 = set((8,7))
>>> s1
{6, 7}
>>> s2
{8, 7}
>>> s1 — s2 # разность множеств
{6}
>>> s1 | s2 # объединение множеств
{8, 6, 7}
>>> s1 & s2 # пересечение множеств
{7}
Рассмотрим пример работы с множествами, вы можете найти его в конце этой функции из файла cookies.py (рядом с пометкой
Файл status_codes.py нужен только для того, чтобы создать объект, который может искать коды состояний по атрибуту. Мы сначала покажем определение словаря в файле status_codes.py, а затем — фрагмент кода файла sessions.py, в котором словарь используется.
Вся эта работа нужна для того, чтобы создать словарь с кодами состояний. Для чего? Использование словаря вместо цифр на протяжении всего кода (что чревато опечатками) позволяет повысить читаемость, а также хранить все эти числа в одном файле. Поскольку все числа, представляющие коды, записаны в словарь, каждое из них появится всего один раз. Вероятность опечаток при этом значительно снижается.
Преобразование ключей в атрибуты вместо их использования в качестве строк в словаре также снижает риск опечаток. Рассмотрим пример кода из файла sessions.py, который гораздо легче прочитать, когда в нем используются слова, а не числа.
Werkzeug
Для того чтобы прочесть код Werkzeug, нам нужно узнать, как веб-серверы общаются с приложениями. В следующих абзацах мы попытались представить максимально короткий обзор по этому вопросу.
Интерфейс Python для взаимодействия серверов с веб-приложениями определен в PEP 333, который написан Филипом Джей Эби (Phillip J. Eby) в 2003 году[68]. В нем указано, как веб-сервер (вроде Apache) общается с приложением Python или фреймворком.
1. Сервер будет вызывать приложение каждый раз при получении запроса HTTP (например, GET или POST).