The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3.3"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3.3"  +/
Сообщение от opennews (??) on 16-Июн-13, 09:06 
Армин Ронахер (Armin Ronacher), один из основателей Pocoo Team (http://www.pocoo.org/) и автор известного шаблонизатора для языка Python  Jinja2 (http://jinja.pocoo.org/), в своём блоге сообщил (http://lucumr.pocoo.org/2013/6/13/werkzeug-and-flask-releases/) о выходе новых версий библиотеки для работы с WSGI Werkzeug 0.9 (http://werkzeug.pocoo.org/) и легковесного веб-фреймворка Flask 0.10 (http://flask.pocoo.org/). Данные версии вышли после значительного перерыва (около года), но в дальнейшем автор предполагает выпускать релизы более часто. Длительная разработка объясняется существенными изменениями в коде, связанными с поддержкой Python версии 3 (точнее, Python 3.3, использование версий Python 3.0-3.2 настоятельно не рекомендуется), и с некоторыми изменениями в API (http://werkzeug.pocoo.org/docs/changes/#api-changes).


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


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

<blockquote>

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

Начнём с неприятных вещей. Вероятно, ваш код, написанный с использованием предыдущих версий Werkzeug будет (слегка) поломан. Это было необходимо, так как часть функций не полностью обеспечивают выполнение обновлённой спецификации PEP 3333 (http://www.python.org/dev/peps/pep-3333/). Данные нарушения обратной совместимости большей частью ограничены модулем werkzeug.urls, а также структурами данных Headers и EnvironHeaders. Теперь вы заметите, что заголовки всегда возвращаются в Unicode, декодированными из latin1, а модуль URLs прозрачно объединяет в себе обе разновидности представления URL-адресов - URI (http://ru.wikipedia.org/wiki/URI) и IRI (http://ru.wikipedia.org/wiki/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) запросов (http://en.wikipedia.org/wiki/Chunked_transfer_encoding).-  Для большей гибкости при работе с формами, в качестве будущей замены для старых дескрипторов .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 благодарит сообщество и особенно отдельных участников (http://lucumr.pocoo.org/2013/6/13/werkzeug-and-flask-release...) за то, что оно сделало возможными эти новые выпуски. Огромное количество работы для этих выпусков было выполнено в рамках специально запланированных онлайн-мероприятий в течение майских выходных.
В данных выпусках количество коммитов "взлетело до небес". Хотя не все изменения из общего журнала могут выглядеть впечатляющими, основополагающие улучшения и чистка кода всё же существенна.
</blockquote>

URL: http://lucumr.pocoo.org/2013/6/13/werkzeug-and-flask-releases/
Новость: http://www.opennet.me/opennews/art.shtml?num=37186

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от Аноним (??) on 16-Июн-13, 09:06 
Есть смысл с Bottle.py перейти на Flask? Для Python 3.3.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –7 +/
Сообщение от Фигов on 16-Июн-13, 09:13 
Хороший повод не издеваться над трупом змеи.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 09:14 
> Есть смысл с Bottle.py перейти на Flask? Для Python 3.3.

Ну, во-первых,  bottle.py уже давно поддерживает python 3.

А что касается смысла - сам над этим думаю, но пока причин не вижу. На python 3 раньше 2014 года тоже переходить не буду. Пусть 2014 год будет годом окончательного linux на десктопах и питона 3 в питонницах.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от Аноним (??) on 16-Июн-13, 09:27 
>> Есть смысл с Bottle.py перейти на Flask? Для Python 3.3.
> Ну, во-первых,  bottle.py уже давно поддерживает python 3.

Точнее я уже использую Python 3.3, а не собираюсь на него переходить.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +1 +/
Сообщение от Xasd (ok) on 16-Июн-13, 10:09 
мне кажется Flask хорош тем что он является запасным вариантом на случай если Bottle вдруг погибнет :) .

а если нужно что-то по-навороченее чем Bottle/Flask -- то есть Piramyd . и оно тоже работает на Python-3.X ..

...хотя Piramyd занимает в 2~4 раза больше оперативной памяти чем Bottle, в случае простейших HelloWorld-alike-страничках (и имеет дофига звисимостей.. что иногда не очень приятно)..

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –2 +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 10:27 
По моему мнению, не претендующему ни на что, при всём богатстве и многообразии вебпаев один и два (если не брать узкопрофильные на мой взгляд вещи, как торнадо, твистед плюс черипай и и иже), есть только четыре достойных фреймворка чисто для веба на python:

bottle, flask, pyramid, django(-nonrel).

будем спорить? :)

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

11. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –2 +/
Сообщение от Аноним (??) on 16-Июн-13, 12:32 
> bottle, flask, pyramid, django(-nonrel).

ИЧСХ, ни на одном из них не замечено ни единого сильного продукта.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

12. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –1 +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 12:33 
> ИЧСХ, ни на одном из них не замечено ни единого сильного продукта.

"это не песня, это мантра"


Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

18. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от Аноним (??) on 16-Июн-13, 15:46 
Тебе, как специалисту по мантрам, виднее.
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

13. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от Xasd (ok) on 16-Июн-13, 13:23 
> ни на одном из них не замечено ни единого сильного продукта.

в как его заметить? неужто кто-то подпишет "я сделал это на Bottle!"? :-)

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

14. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 13:42 
>> ни на одном из них не замечено ни единого сильного продукта.
> в как его заметить? неужто кто-то подпишет "я сделал это на Bottle!"? :-)

Кстати, а какая разница, кто чего сколько сделал? Главное - какие это возможности даёт. Я, например, вот этот твитер http://bug.51t.ru , когда мне понадобился, написал за 2 часа, от задумки до реализации, включая "дезаен". 125 строк: http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py понятный код, который я даже через 2 года разберу, всё приложение, кроме шаблонов - в одном файле. Что ещё нужно для счастья?

кстати, товарищи, мож кто подскажет, а то что-то сообразить не могу, как вот это счастье:

# http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py#l23
[uflt(k) for k in out]

# http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py#l116
def uflt(o):
   n = mydict()
   for k,v in o.items():
      if k != 'ip': n[k]=v
   return n

в одну строку завернуть? а то страшновато смотрится.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 13:51 
> # http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py#l23
> [uflt(k) for k in out]
> # http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py#l116
> def uflt(o):
>    n = mydict()
>    for k,v in o.items():
>       if k != 'ip': n[k]=v
>    return n
> в одну строку завернуть? а то страшновато смотрится.

можно сделать [k.update(ip='hidden') for k in out], но это будет влиять на out, насколько я понимаю.

хотя не, это вообще не работает, k.update возвращает null :(

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

20. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от letitbee on 16-Июн-13, 15:48 
>[оверквотинг удален]
> вот это счастье:
> # http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py#l23
> [uflt(k) for k in out]
> # http://hg.51t.ru/twi-json/file/b7aefc8f4ce5/run.py#l116
> def uflt(o):
>    n = mydict()
>    for k,v in o.items():
>       if k != 'ip': n[k]=v
>    return n
> в одну строку завернуть? а то страшновато смотрится.

n = mydict(o); n.pop('ip', None)
или
n = mydict({k: v for k, v in o.iteritems() if k!='ip'})

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

21. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 15:59 
> n = mydict(o); n.pop('ip', None)
> или
> n = mydict({k: v for k, v in o.iteritems() if k!='ip'})

Это не совсем то. Вот структура:

[
    {
        "msg": "я пришёл на работу работать, а не на глупые вопросы отвечать, почему я пьяный здесь сплю",
        "num": 41,
        "ip": "1.2.3.4",
        "typ": "act",
        "ts": 1371184587
    },
    {
        "msg": "девочки довольны!",
        "num": 40,
        "ip": "1.2.3.4",
        "typ": "act",
        "ts": 1371123121
    },
    {
        "msg": "#6 (gui: кроссплатформенный клиент на pyqt): решено",
        "num": 39,
        "ip": "1.2.3.4",
        "typ": "bug",
        "tracker": "ready",
        "ts": 1371123108
    },
    {
        "msg": "#8 (gui: всплывающие иконки): решено",
        "num": 38,
        "ip": "1.2.3.4",
        "typ": "bug",
        "tracker": "ready",
        "ts": 1371123105
    }
]

я сейчас сделал вот так (сократил размер до 120 строк), но в 2 строки и с заменой out [я НЕЧИСТ :(].

[k.pop('ip') for k in out]
return json.dumps(out,indent=4, separators=(',', ': '), ensure_ascii=False)

Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

22. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 16:16 
116 строк. 3636 байт. отлично. борьба за 100 строк должна стать нормой жизни.
Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

25. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от gegMOPO3 on 16-Июн-13, 19:26 
> [k.pop('ip') for k in out]

Пора в отпуск.

for k in out:
    del k['ip']

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

34. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от ws (ok) on 16-Июн-13, 21:25 
Если нужно вычистить поле ip не изменив входные данные:
[{k:v for k,v in o.items() if k != 'ip'} for o in out]
Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

37. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 17-Июн-13, 06:46 
> Если нужно вычистить поле ip не изменив входные данные:
> [{k:v for k,v in o.items() if k != 'ip'} for o in
> out]

наверное, [mydict((k,v) for k,v in o.items() if k != 'ip') for o in out]

спасибо, что-то подобное в голове крутилось, но руки боялись :)

Ответить | Правка | ^ к родителю #34 | Наверх | Cообщить модератору

19. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –5 +/
Сообщение от Аноним (??) on 16-Июн-13, 15:47 
> в как его заметить? неужто кто-то подпишет "я сделал это на Bottle!"? :-)

Для начала покажи хоть 1 приличный продукт "на питоне". Только не надо в гуглы всякие тыкать - с их ресурсами можно для себя в 1 экземпляре что угодно хоть на брейнфаке написать.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

32. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +1 +/
Сообщение от Xasd (ok) on 16-Июн-13, 21:02 
> Для начала покажи хоть 1 приличный продукт "на питоне".

блин, что за такие анонимы пошли...

..ды ты хоть знаешь как отличить сайт на Python от сайта на ,например, PHP ??

неужто ты наивно полагаешь там будут URL оканчиваться на *.py ??? :-)

Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

35. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +1 +/
Сообщение от ws (ok) on 16-Июн-13, 21:31 
Из последних нашумевших - http://instagram.com
Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

38. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +1 +/
Сообщение от jbo email(??) on 17-Июн-13, 13:03 
disqus, bitbucket.org из рунета yandex, mail.ru полюбили django для второстепенных проэтов
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

9. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –1 +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 10:30 
Кстати, пацаны-бутыльщики, давайте кодами меняться, если у кого есть что для дома для души.

Я всё, за что не стыдно, выкладываю на http://hg.51t.ru (правда, многое уже удалил, потому что было стыдно, и есть желание переписать).

ps. Я пишу на 2.7.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

10. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +2 +/
Сообщение от Аноним (??) on 16-Июн-13, 12:27 
> ps. Я пишу на 2.7.

Т.е. заведомо на мусорный бак...

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

39. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +1 +/
Сообщение от quux email(??) on 17-Июн-13, 15:15 
А может это и к лучшему.
Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

40. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 17-Июн-13, 15:24 
> А может это и к лучшему.

"я не пишу для пианистов, я пишу музыку, для публики"

Ответить | Правка | ^ к родителю #39 | Наверх | Cообщить модератору

41. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от Аноним (??) on 17-Июн-13, 17:12 
Ну да, как минрософт.
Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

16. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от Аноним (??) on 16-Июн-13, 14:08 
Ну вот и самые "верные тормоза python2" перешли на python3.
Теперь все крупные и популярные проекты с полной поддержкой python3.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

17. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  +/
Сообщение от бедный буратино (ok) on 16-Июн-13, 14:14 
> Ну вот и самые "верные тормоза python2" перешли на python3.
> Теперь все крупные и популярные проекты с полной поддержкой python3.

122 из top200. при том, что некоторые прямо говорят "знать не знаем никакого python3"

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

28. "Новые релизы Werkzeug 0.9 и Flask 0.10 с поддержкой Python 3..."  –2 +/
Сообщение от kurokaze (ok) on 16-Июн-13, 20:01 
>поддержка Python 3. Точнее, Python 3.3 и выше

Последнее удивляет, неужели наконец Гвидо пообещал больше не ломать совместимость?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру