Армин Ронахер (Armin Ronacher), один из основателей Pocoo Team и автор известного шаблонизатора для языка Python Jinja2, в своём блоге сообщил о выходе новых версий библиотеки для работы с WSGI Werkzeug 0.9 и легковесного веб-фреймворка Flask 0.10. Данные версии вышли после значительного перерыва (около года), но в дальнейшем автор предполагает выпускать релизы более часто. Длительная разработка объясняется существенными изменениями в коде, связанными с поддержкой Python версии 3 (точнее, Python 3.3, использование версий Python 3.0-3.2 настоятельно не рекомендуется), и с некоторыми изменениями в API.

Примерно спустя сутки после анонса новых выпусков Werkzeug 0.9 и Flask 0.10, через свой twitter автор сообщил о выходе корректирующих версий, с исправлением обнаруженных по горячим следам проблем) - Werkzeug 0.9.1 и Flask 0.10.1. Кроме того, для корректирующих выпусков Werkzeug и Flask в репозитории готовых пакетов PYPI была присвоена метка "Programming Language :: Python :: 3". По информации регулярно обновляемого реестра, с наглядным представлением статуса поддержки Python 3 для 200 популярных пакетов, 10 июня 2013 года с третьей веткой Python готовы работать 122 пакета.

Ниже следует перевод объявления о новом выпуске:

Что было "сломано" по сравнению с предыдущими версиями

Начнём с неприятных вещей. Вероятно, ваш код, написанный с использованием предыдущих версий Werkzeug будет (слегка) поломан. Это было необходимо, так как часть функций не полностью обеспечивают выполнение обновлённой спецификации PEP 3333. Данные нарушения обратной совместимости большей частью ограничены модулем werkzeug.urls, а также структурами данных Headers и EnvironHeaders. Теперь вы заметите, что заголовки всегда возвращаются в Unicode, декодированными из latin1, а модуль URLs прозрачно объединяет в себе обе разновидности представления URL-адресов - URI и IRI.

Кроме того, объект Headers теперь не может по-старому, через метод класса linked, на месте изменять заголовки WSGI. Это было необходима для того, чтобы избежать слишком сложной реализации, и чтобы не менять логику PEP 3333, при этом добившись приемлемой производительности.

Flask "поломан" в меньшей степени, но кое-что всё равно следует учесть. Были произведена чистка внутренних частей кода, в первую очередь вы заметите другую сериализацию JSON фильтра |tojson и другие правила безопасности HTML. Если у вас есть тесты, полагающиеся на старое поведение, вам придётся их поправить.

До свидания, Python 2.5

Плохие новости для тех, у кого Python версии 2.5: ваша версия более не поддерживается. Это пришлось сделать, чтобы продвинуться в сторону версии с поддержкой Python 3. Так как Python 2.5 был выпущен около 7 лет назад, самое время двигаться дальше.

Привет, Python 3

Есть и положительная сторона - поддержка Python 3. Точнее, Python 3.3 и выше. Для приложений Werkzeug портирование на Pyhton 3 может стать не совсем тривиальным, зато приложения Flask должны заработать "из коробки", при условии, если расширения Flask также уже портированы. Например, все примеры из документации Flask работают из коробки, без необходимости изменения кода - как под 2.x, так и под 3.x (за исключением тестов моделей).

Заметные изменения

Кроме уже указанных изменений, есть и такие, от которых вы, как надеется автор, получите истинное удовольствие:

  • Werkzeug:
    • Теперь Werkzeug сохраняет уведомления о причинах возникновения ошибок (traceback) в приватных разделах GitHub (gists).
    • Некоторые небольшие улучшения, связанные с улучшением использования классов исключений HTTP в Werkzeug. Теперь они несут некоторую полезную нагрузку, избегая аварийного завершения работы при возникновении исключений.
    • Модуль URL значительно улучшил поддержку IRI, теперь он может корректно обрабатывать и присоединять URL-адреса. На текущий момент, эта поддержка преднамеренно реализована с нарушением RFC, в целях лучшего покрытия случаев из реальной жизни и для поддержки разбора неизвестных схем. В результате можно без лишних сюрпризов разобрать такие случаи, как sqlite:///foo.db.
    • Werkzeug получил много полезных функций, обеспечивающих преодоление различий между PEP 333/PEP 3333 и WSGI версий 2.x и 3.x, включая доступ к потокам и URL-адресам.
    • Внутренний парсер форм значительно улучшен и позволяет иметь доступ к потоку во всех случаях. Он также больше не полагается на длину контента, что наконец-то сделало возможным иметь дело с группами тел разбитых на части (chunked) запросов.
    • Для большей гибкости при работе с формами, в качестве будущей замены для старых дескрипторов .data для запросов и ответов, введёны методы get_data. Это обеспечит большую гибкость при работе с данными форм. В будущем, когда доступ к атрибутам объектов запроса и ответа будет работать в значительной мере без побочных эффектов, поддержка .data будет удалена.
  • Flask:
    • Flask обзавёлся модулем json, который унифицирует поддержку JSON для Python 2.x и 3.x, а также расширяет её полезными помощниками (helpers). Он обеспечивает безопасные методы для получения дампов JSON в блогах скриптов в HTML, а также автоматически сериализует некоторые общие типы, такие, как UUID-ы и объекты "дата-время".
    • Была проделана дальнейшая работа, чтобы сделать контекст приложения более заметным. Отображение шаблонов теперь может происходить только из контекста приложения, flask.g теперь также привязан к контексту приложения. Это изменение может показаться крошечным, но на самом деле оно упрощает работу с Flask вне веб-среды. Например, теперь стало проще поддерживать соединения с БД, которые не привязаны к времени жизни запроса HTTP. Для описания этого нового режима работы начато внесение изменений в документацию.
    • Улучшена обработка внутренних ошибок Flask, с целью получения в случае их возникновения более логичной реакции. Также, у обработки ошибок появилось дополнительное преимущество - наконец, надёжно реализовано "при успехе - совершить, при ошибке - откатить".
    • Исходя из необходимости обеспечения соответствия новому методу get_data в Werkzeug, введён метод get_json. Это подразумевает наличие в дальнейших планах одновременное удаление дескриптора .json.
    • Добавлено несколько настроек конфигурации для изменения умолчаний при сериализации JSON. Сюда входят красивое форматирование и изменение порядка ключей. Теперь объекты JSON по умолчанию упорядочены по ключам, для решения проблемы с недействительными HTTP-кэшами из-за нового начального числа для генерации случайных хэшей.

Изменения в процессе разработки

В будущем, ход выпуска релизов будет изменён. Цель - вместо больших, формировать намного более частые релизы. В настоящее время Werkzeug, так как его API стал более стабильным, достиг точки, когда возможны частые выпуски новых версий без поломки пользовательского кода (в связи с появлением поддержки Python 3, этот релиз здесь является заметным исключением).

Благодарности

Наконец, Armin благодарит сообщество и особенно отдельных участников за то, что оно сделало возможными эти новые выпуски. Огромное количество работы для этих выпусков было выполнено в рамках специально запланированных онлайн-мероприятий в течение майских выходных. В данных выпусках количество коммитов "взлетело до небес". Хотя не все изменения из общего журнала могут выглядеть впечатляющими, основополагающие улучшения и чистка кода всё же существенна.