Вообще-то, это картинка от wtforms, но у меня гимп почему-то не запускается. Эту статью я пишу в баре. Очень хочется похоливарить, но бармен на меня смотрит круглыми глазами, а кальянщик просто улыбается и мотает головой. Однажды, меня спросили: что плохого во flask? Тогда меня полностью устраивал этот милый фреймворк. Поработав с ним какое-то время, я написал все, что думаю, в рабочий слак, на что мне ответили: "Мурад, будь добрее". Вообще, я добрый и пушистый, но wtf?! Стоит отметить, что я являюсь большим поклонником работы Армина. Его пакеты используются во многих мои проектах. А еще он невероятная заноза в сообществе Python. И это хорошо. Flask — это обертка над очень крутыми обособленными проектами. Некоторые сравнивают его с джангой. Я хз почему. Если попытаться описать все проблемы фласка в двух пунктах: Все. Дальше можно не читать. Но если все еще не понятно, листаем дальше. Если в джанге все приложения подключаются в INSTALLED_APPS, то во фласке используется концепция blueprints. Этакое приложение и обособленный неймспейс урлов в одном флаконе: Далее, можно роутить урлы так: url_for('simple_page.index').  А ее нет. Нельзя просто так взять и сделать вложенный неймспейс. В сети можно найти "решения", но здесь я буду рассматривать только коробочный фласк, потому что написать-то можно все. Когда вы делаете так в продакшен коде: Где-то в мире грущу я! Берегите меня, выносите это в сеттинги. Концептуально. Но работать не будет. Потому что пару строчек назад мы импортировали пакет в myapp и навечно заказали себе путь туда. Погодите, должен быть выход! Ага! И это не работает. Потому что current_app доступен только в контектсте реквеста! — Вынеси это наконец в файл сеттингов приложения, больной ублюдок! — голос из зала.
— А как я буду их подменять на проде или тестовом, а? Кстати, для джанги на этот случай у меня есть специальная батарейка.
Просто представьте себе прекрасный дивный мир, где django.conf.settings доступен только в контексте реквеста! Нельзя не пошутить про одноименную точку. А главное, ее не нужно искать, она всегда тут: flask.g. Бада-бум-тсс!
Вот поэтому Армин — мой кумир!  В нее можно пробросить все необходимое: Однако, это будет работать только в контексте реквеста, как и любые другие магические объекты фласка. У меня на сайте есть такой кусок урлов: ApiView обрабатывает только один метод — POST. Угадайте, что будет если спросить GET? Ага, 404. Ее обеспечивает вторая вьюшка.
Чтобы получить NOT ALLOWED, нужно явно вернуть 405 в ApiView! Fask, что с тобой не так? А. Погодите. Это мне. Омн-омн-омн. Ох. Допустим, нам нужно отключить проверку в одной вьюхе: Значит, нам нужен app. Помните про импорты, да? Ищем выход, лезем в сорцы: Ура! Можно передать путь до вьюхи (в версии, которая вышла две недели назад)! Пробуем: Не работает. На самом деле (ненавижу это выражение), мы подменили имя вьюхи, когда вызывали ApiView.as_view('api_view'): И "все равно", что мы указываем путь до объекта, которого нет. Работает! Не работает. А знаете почему? Потому что форма. Она ничегошеньки не знает про вьюху: Вот теперь работает. Допустим, вы хотите сделать так: Забудьте. Вне контекста не работает. Наверное, можно сделать свой ленивый объект, в конце-концов, в джанге это тоже не сразу появилось. Штука, призванная помочь с тестами. Например, можно заглянуть в контекст, который передается в шаблон. А давайте попробуем: Ой. Что-то пошло не так. А знаете что? Я вот тоже не знаю.
На самом деле (ненавижу это выражение), я схватил NotImplementedError в одном из методов, которые не переопределил. Но поинт в том, что уронив тесты, вам ни за что не понять в чем причина. В процессе ковыряния фласка, нашел несколько моментов: Здесь что-то происходит. Это все, что я понимаю. И это: А теперь ягодки: Все, жгите! P.S. А чего я один эээ статьи пишу, м? Кто хочет на той неделе, скажем, во вторник (чтобы больше вместить) пойти в бар (в Питере, в районе Звездной)?.. Пишите в инбокс. P.P.S. Хабр, ты почему не типографишь тексты? Вот, я даже штуку написал!