Веб-приложения: Flask #
Python — это многоцелевой язык. В прошлом упражнении мы создавали приложения для командной строки, теперь рассмотрим веб-приложения.
Существует больше веб-фреймворков для Python, среди самых известных — Django, Flask или Pyramid.
Для наших целей мы будем использовать Flask, потому что он самый быстрый для понимания и строго не требует использования парадигмы MVC.
Флакон №
Вы можете снова установить Flask в virtualenvu, лучше всего использовать проект из предыдущего упражнения:
Основное использование Flask довольно примитивно. В файле hello.py напишите:
Затем запустите приложение, используя следующие команды. (В Windows вместо экспорта используйте набор команд.)
Вы должны увидеть текст, используемый в браузере по указанному адресу.
Переменная среды FLASK_APP сообщает Flask, где найти приложение. В заданном файле Flask автоматически ищет переменную с именем app. (Другие также могут быть установлены.) Переменная FLASK_DEBUG устанавливает режим отладки, который мы опишем чуть позже.
В программе мы создали фляжное приложение как приложение. Аргумент __name__ — это имя модуля — Flask использует его для поиска файлов, принадлежащих приложению (см. ниже статические и шаблоны).
С помощью декоратора @app.route мы зарегистрировали так называемый view (представление) — функцию, возвращающую контент для заданного маршрута в URL. Эта комбинация функции пути и представления называется route (или в уважительном смысле «маршрут»). Мы специально говорим, что контент, возвращаемый функцией index .
, будет доступен по пути / (то есть на «домашней странице»)
Можно обслуживать несколько разных адресов, просто добавляя дополнительные функции:
По адресу http://127.0.0.1:5000/hello/ вы увидите вторую страницу.
Режим отладки #
Переменная FLASK_DEBUG указывает приложению работать в режиме отладки: включается более удобный дамп ошибок, и приложениеавтоматически перезапускается после изменений.
Попробуйте сгенерировать исключение в функции hello() (например, деление на ноль — 1/0 ) и посмотрите, как ошибка «выглядит» в режиме отладки: Flask покажет traceback , подобный этому из командной строки, плюс вы на каждом уровне, это позволит использовать маленькую иконку для запуска консоли. PIN-код безопасности для этой консоли можно найти в терминале, где запущен сервер.
Режим отладки полезен, но опасен — он позволяет посетителям сайта (после взлома довольно простого «пароля») запускать любой код Python. Кроме того, это замедляет работу приложения. Поэтому используйте его только на своем компьютере.
Динамические маршруты #
При создании динамического веб-сайта не всегда можно заранее знать все URL-адреса. Например, вы хотите отображать информацию о пользователях по таким адресам, как /user/hroncok/ , но вы не можете добавлять новую функцию в свой код каждый раз, когда регистрируется новый пользователь. Вы должны использовать динамические маршруты:
Заключите переменную часть пути в фигурные скобки и используйте ее как параметр функции. При желании вы можете указать, к какому контенту применяется правило. Например, вы можете ввести числовой идентификатор статьи для таких адресов, как /post/42/, следующим образом:
Вы можете использовать разные правила, например:
- строка принимает любой текст без косой черты (по умолчанию)
- int принимает целые числа (и передает их в функцию представления как int , а не текст)
- float также принимает десятичные числа с точками (и передает их как float )
- путь принимает текст даже с косой чертой
Вы можете определить более одного маршрута для одной функции. Это часто используется со значением аргумента по умолчанию:
Получить URL #
Противоположный способ доступа к маршрутам — это когда вам нужно получить URL-адрес страницы, например, потому что вам нужно отобразить ссылку. Для этого используется функция url_for(), которая принимает в качестве первого параметраимя маршрута (или имя функции, обрабатывающей маршрут), а затем именованные аргументы для правил в динамическом маршруте:
Эту функцию можно использовать только внутри функции просмотра. Если вы хотите протестировать ее, например, в интерактивной консоли, вы можете использовать специальный контекст:
Вам может быть интересно, почему бы просто не создать URL-адрес вручную. Однако при таком подходе вы можете столкнуться с проблемой, если позже измените путь, что может произойти, например, даже если вы развернете веб-сайт на другом сервере. Генерация URL также может упростить развертывание статической версии страниц.
Поэтому для URL-адресов на вашем сайте мы рекомендуем последовательно использовать url_for.
Шаблоны #
Пока наш сайт довольно скучный: он содержит только обычный текст, никакого HTML.
Мы предполагаем, что вы знаете, что такое HTML и CSS. Если нет, рекомендуем ознакомиться с основами этих веб-технологий, например, на веб-сайте MDN.
Вы можете легко сделать что-то вроде:
. но, наверное, это было бы не очень приятно. Python — это язык, созданный для описания алгоритмов, процессов и логики, а не контента. Лучше поместить HTML в отдельный файл и использовать его как шаблон (англ. template ). Из Flask использование шаблона выглядит так:
Функция render_template не только возвращает HTML из заданного файла, но также может добавлять к нему информацию, которую она получает в именованных аргументах.
Покажем это на примере: рядом с файлом кода создайте папку templates и в ней hello.html с таким содержимым:
Шаблоны используют (по умолчанию) язык шаблонов Jinja2, который часто используется с Flask и другими платформами Python. Вы можете найти полное описание языка в документации, но для большинства страниц вы можете обойтись добавлением значения ( << переменная >> ) и условного содержания ( <% if %>), как указано выше. , или с циклом: <% для%>/ <% конец для %>. В больших приложениях полезно использовать <% include . %>, <% расширяет . %>и, возможно, также создание макросов <%macro . %>/ <% endmacro %>.
Весь контекст (переменные) шаблона должен исходить из вызова render_template(). Кроме того, вы можете использовать функции выбора, такие как url_for(). (Однако другие функции, известные из Python, использовать нельзя — хотя они и похожи, Jinja2 — это другой язык, чем Python.)
Фильтры #
Не очень элегантно брать некоторые данные (например, твиты из Twitter API) и вставлять в них свои модификации (например, преобразование в HTML) перед передачей их в шаблон. Вот для чего нужны фильтры. Фильтр преобразует значение в строку, которую мы затем показываем пользователю.
Например, вот фильтр времени, который считывает время в одном формате и преобразует его в другой:
В шаблоне date_example.html фильтр применяется по вертикали:
Если вам нужен очень общий фильтр, рекомендуется поискать в списке встроенных.
Экранирование #
Символы, имеющие особое значение в HTML, автоматически заменяются в тексте, вставляемом в шаблоны. Это предотвращает угрозы безопасности, когда пользовательский ввод интерпретируется как HTML.
Например, когда мы посещаем URL /hello/
в приложении выше
Изменить эту страницу на
Написано Миро Хрончоком, Петром Викториным и другими для курса MI-PYT в ЧТУ, 2016-2017 гг.