Значение __name__ и @app.route во Flask, Python
Здесь (в книге) указано, что «классу Flask нужно знать текущее значение name, когда создаётся новый объект Flask, поэтому оно должно быть передано в аргументе, что мы и сделали» — вообще не понял, зачем это нужно. Ну и соответственно, как работает route я тоже не понял. Объясните, пожалуйста, максимально доходчиво.
Отслеживать
задан 16 мар 2018 в 16:34
Виталий Суворов Виталий Суворов
3 3 3 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
name это специальная переменная(атрибут модуля) в которую сохраняется имя модуля. Просто о модулях — https://wombat.org.ua/AByteOfPython/modules.html @function — это декоратор. Грубо говоря декоратор это функция которая изменяет поведение другой функции, в гугле очень много инфы по поводу декораторов, поэтому примеры писать не буду. В текущем примере @app.route обрабатывает функцию hello() перед ее исполнением @app.route def hello(): pass
является тем же что и hello_new = app.route(hello) # hello_new — это измененная функция hello() . Касаясь самого фласка, app.route обрабатывает функцию hello как адрес(ссылку) на функцию представления нашего приложения. То есть чтобы при запуске нашего приложения увидеть ‘Hello world from Flask’, нам нужно обратится к функции hello, которая вернет нам эту строку, а функция вызывается с помощью указания ее имени как пути к странице приложения. http:\app_host:app_port\hello.
Отслеживать
ответ дан 17 мар 2018 в 3:54
Vladimir Yaremenko Vladimir Yaremenko
161 1 1 золотой знак 2 2 серебряных знака 9 9 бронзовых знаков
- python
- flask
- route
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951
Что такое Flask и как на нем быстро написать простой сайт

Рассказываем про один из самых популярных и лаконичных микрофреймворков для Python — Flask. Как написать простое приложение, подключить к нему Bootstrap и базу данных, и есть ли вообще у Flask минусы.
Flask — это микрофреймворк для создания веб-приложений на Python. В нем из коробки доступен только минимальный инструментарий, но при этом он поддерживает расширения так, как будто они реализованы в самом Flask. Расширения для микрофреймворка позволяют коммуницировать с базами данных, проверять формы, контролировать загрузку на сервер, работать с аутентификацией и многое другое.
Первая публичная версия Flask вышла 16 апреля 2010 года. Автор проекта — Армин Ронахер , который возглавлял команду энтузиастов в Python-разработке Poocco. Flask основан на быстром и расширяемом механизме шаблонов Jinja и наборе инструментов Werkzeug. Кроме того, Flask использует одну из самых передовых служебных библиотек WSGI (Web Server Gateway Interface — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером).
При этом WSGI тоже разработал Армин Ронахер. По его словам, идея Flask изначально была первоапрельской шуткой, которая стала популярной и превратилась в серьезное приложение.
Изучите Python на Хекслете Пройдите нашу профессию «Python-разработчик», чтобы поменять свою жизнь и стать бэкенд-программистом.
Плюсы и минусы Flask
Практически все плюсы и минусы Flask появились именно из-за того, что он является микрофреймворком.
- Простота. Flask легко установить и настроить.
- Гибкость. Микрофреймворк позволяет разработчикам самостоятельно выбирать технологии и инструменты, которые они хотят применять в своих проектах
- Расширяемость. Flask позволяет расширять функциональность с помощью плагинов и модулей, которые можно легко интегрировать в проект.
- Активное сообщество. Flask является одним из самых используемых фреймворков для Python, поэтому имеет большое комьюнити разработчиков.
При этом у Flask есть и свои недостатки:
- Отсутствие готовых решений. Разработчики изначально могут использовать во Flask только минимальный набор функциональности. Если же программисту нужны более широкие возможности, такие как аутентификация пользователя, ему придется добавить дополнительные библиотеки или реализовать это самостоятельно.
- Нет встроенной многопоточности. Flask был разработан как однопоточный фреймворк. И чтобы управлять многопоточными веб-приложениями, придется установить дополнительные библиотеки.
- Ограниченные возможности для масштабирования. Если проект начинает расти и усложняться, то могут появиться сложности в поддержке нужной функциональности.
То есть Flask можно удобно использовать в небольших проектах — он идеален для макетирования идей и быстрого прототипирования. При этом его редко используют в крупных проектах, и он плохо подходит для асинхронного программирования.
Как создать проект на Flask
Для начала работы с микрофреймворком нужно скачать последнюю версию Flask:
pip install Flask
Для примера мы напишем на Flask тестовое веб-приложение с минимальным функционалом. Как работают приложения такого типа:
- Пользователь вводит в браузере url, например — hexlet.io. В нашем тестовом приложении пользователь не будет вводить url, потому что мы будем работать с локальным сервером по адресу http://127.0.0.1:5000 .
- Браузер получает у DNS IP-адрес нужного нам сервера. DNS — это Domain Name System, распределенная системе серверов. Она работает как общая «контактная книга» в интернете.
- Браузер отправляет запрос по этому адресу и получает ответ. Как правило — в виде HTML-страницы.
- Браузер отображает содержимое страницы.
Итак, создадим файл hello.py и запишем в него следующий код:
from flask import Flask app = Flask(__name__) @app.route('/') def index() -> str: return 'Hello Flask!
' if __name__ == '__main__': app.run(debug=True)
Давайте подробно разберем, что делает код, который мы написали.
Первой строкой мы импортируем класс Flask . После этого мы создаем объект этого класса, передав первым аргументом имя модуля, — это и будет наше приложение для общения с веб-cервером. __name__ — это удобный способ передать именно то приложение, из которого запущен Flask.
Декоратор route() сообщает Flask, при обращении к какому URL-адресу запустится декорируемая разработчиком функция — в нашем примере это index . Последней строчкой мы открываем локальный веб-сервер с параметром debug=True — это позволит следить за всеми ошибками в логе программы.
Читайте также: Программирование на Python: особенности обучения, перспективы, ситуация на рынке труда
Запускаем веб-приложение через терминал:
Если мы все сделали правильно, то в терминале появятся эти сообщения:

В основном тут отображается служебная информация. Единственное, что нас интересует — сообщение, что наш локальный сервер запущен по адресу http://127.0.0.1:5000/ . В нем красными буквами указывается, что локальный сервер не подходит для продакшена. Но, так как мы реализовали тестовое приложение, то не будем деплоить его на реальный сервер.
Вернемся к коду. С помощью переменной части маршрута Flask может передавать в функцию аргументы.
from flask import Flask app = Flask(__name__) @app.route('/') def index(): greet_with_link = """Привет, Мир!
Нажми на меня
""" return greet_with_link @app.route('/user//') def get_user(name, surname): personal_instruc = f"""Привет,
surname> name>! Измени имя пользователя в адресной строке и перезагрузи страницу
""" return personal_instruc if __name__ == '__main__': app.run(debug=True)
В нашем примере значения просто появятся в браузере как часть строки. На стартовой странице нашего сайта будет запускаться функция index() . В ней пользователю, помимо приветствия, будет предлагаться нажать на ссылку, при клике на которую он перейдет на user/Аникин/Георгий . Этот URL-маршрут будет обрабатываться уже функцией get_user .
Функция get_user декорируется @app.route(‘//’) , а в адресной строке у нас /user/Аникин/Георгий . То есть наша функция получает аргументы из URL-адреса, эти значения лежат между косых скобок. По умолчанию тип таких значений string принимает любой текст без косой черты. Но переменные маршрутов могут быть и иных типов: int , float , path и других. Типы указываются в формате .
Структура приложения на Flask
Создадим подкаталог flask_app с такой структурой файлов и папок:

Чтобы написать приложение сложнее одной строки, в директории проекта должны находиться папки static и templates . Директория static содержит ресурсы, которые используются шаблонами. В том числе включая файлы CSS, JavaScript и картинки. Папка templates содержит только шаблоны с расширением *.html .
Заполним наши файлы кодом. Сначала — наш основной файл проекта app.py :
from flask import Flask, render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") @app.route("/about") def get_page_about(): return render_template("about.html") if __name__ == "__main__": app.run(debug=True)
После этого — index.html :
Main page Главная страница
И файл about.html :
About О приложении
Для отображения HTML-шаблонов мы используем функцию render_template() . В нашем коде она принимает только имя шаблона и возвращает строку с результатом рендеринга шаблона.
Однако render_template() может принимать неограниченное количество именованных аргументов, которые можно использовать в этом шаблоне. Это позволит решить проблему нашего тестового проекта — сейчас у нас две функции, две страницы, и очень много дублированного кода.
Напишем базовый шаблон base.html и пару его наследников. При этом блоки … — это части базового шаблона, которые можно заменить в наследнике. Переменные передаются по именам в конструкции > .
Приложение Flask >
После появления файла с базовым HTML-шаблоном можем поправить наши остальные HTML-файлы:
About index.html: Main page
Кроме того, нужно поправить и основной файл Flask-проекта app.py :
from flask import Flask, render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html", h1 = "Главная страница") @app.route("/about") def get_page_about(): return render_template("about.html", h1 = "О приложении") if __name__ == "__main__": app.run(debug=True)
Подключаем Bootstrap
Bootstrap — это открытый и бесплатный набор инструментов для создания сайтов и веб-приложений.
В нашем проекте в папке templates у нас есть подкаталог bootstrap , а в нем файл base.html — это немного модифицированная заготовка сайта-документации Bootstrap-Flask:
lang="en"> charset="utf-8"> name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> > Приложение Flask class="jumbotron text-center"> > >
В файлах index.html и about.html заменим строку наследования на:
Второй путь подключения Bootstrap к проекту на Flask — через CDN. Подробнее об этом можно почитать в документации фреймворка .
Читайте также: Как создатель Python Гвидо ван Россум устроился в Microsoft и теперь работает над развитием CPython
После подключения Bootstrap нужно будет немного поправить основной файл нашего проекта app.py :
from flask_bootstrap import Bootstrap4 from flask import Flask, render_template app = Flask(__name__) bootstrap = Bootstrap4(app) @app.route("/") def index(): return render_template("index.html", h1 = "Главная страница") @app.route("/about") def get_page_about(): return render_template("about.html", h1 = "О приложении") if __name__ == "__main__": app.run(debug=True)
Последним элементом нашего веб-приложения будет форма отправки. Для этого нужно немного модифицировать index.html :
Main page > class="container text-center"> class="d-inline-block" style="max-width: 33%;"> class="form-group"> for="eventDate">Дата type="date" name="eventDate" class="form-control" placeholder="Дата события"> class="form-group"> for="eventName">Событие type="text" name="eventName" class="form-control" placeholder="Название события"> class="form-group"> for="eventDuration">Продолжительность type="number" name="eventDuration" class="form-control" placeholder="Продолжительность" min="1" max="24"> type="submit" class="btn btn-primary">Записать
Вообще, Bootstrap может добавить огромное количество элементов в приложение буквально в несколько кликов. Мы ограничились четырьмя — три поля и одна кнопка. Ключевой элемент здесь — это > .
Подключаем базу данных
Итак, у нас есть форма отправки, но она пока ничего не делает с данными. Для нас было бы неплохо хранить, обрабатывать и в будущем легко извлекать данные этих форм. Обычно такие задачи решают с помощью реляционных баз данных (далее БД).
Есть большое количество способов работы с SQL-запросами во Flask. Мы можем использовать, например, sqlite3 и чистый SQL, а можем — библиотеку sqlite3 для Python. Кроме того, можно обернуть чистые SQL-запросы в код, либо использовать Psycopg2 для работы с PostgresSQL в Python (мы рекомендуем делать именно так и вот почему). Для примера в этом тексте мы используем библиотеку Flask SQLAlchemy (расширение для Flask), которая предлагает технологию ORM для взаимодействия с БД.
Подключаем базу данных к нашему проекту через файл app.py :
from datetime import datetime from flask import Flask, redirect, render_template, request from flask_bootstrap import Bootstrap4 from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) bootstrap = Bootstrap4(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///events.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class Event(db.Model): id = db.Column(db.Integer, primary_key=True) date = db.Column(db.Date, nullable=False) name = db.Column(db.String(255), nullable=False) duration = db.Column(db.Integer, nullable=False) def __str__(self): return ( f"Название: self.name>\n" f"Дата: self.date>\n" f"Продолжительность self.duration>ч" ) @app.route('/', methods=['POST']) def add_event(): date = datetime.strptime(request.form['eventDate'], '%Y-%m-%d').date() name = request.form['eventName'] duration = int(request.form['eventDuration']) print(date, name, duration, sep='\n') event = Event(date=date, name=name, duration=duration) db.session.add(event) db.session.commit() return redirect('/') @app.route("/") def index(): return render_template("index.html", h1 = "Главная страница") @app.route("/about") def get_page_about(): return render_template("about.html", h1 = "О приложении") if __name__ == "__main__": with app.app_context(): db.create_all() app.run(debug=True)
В нашей БД появился класс Event c атрибутами, который наследуется от db.Model . Это позволяет с помощью SQLAlchemy создать таблицу event , а поля нашего класса сделать колонками этой таблицы. Кроме того, мы определили магический метод __str__ для строкового отображения экземпляров класса — это пригодится для отображения в HTML.
Для создания таблицы в блок if __name__ == ‘__main__’ мы добавили команду db.create_all() , а для обработки отправленной формы — метод add_event . Он работает с методом POST , который указывает Flask, что данные будут отправлены на сервер.
В методе POST мы считываем данные отправленной формы и создаем для каждой строки временную переменную. После этого мы создаем объект event класса Event , передаем наши временные переменные как именованные аргументы, добавляем event в БД и фиксируем изменения.
Нам осталось лишь немного поправить форму: в файле index.html в открывающем теге добавим атрибуты action=»>» method=»POST» . Теперь форма отправки по нажатию на кнопку «Записать» будет отправлять данные в базу данных.
Добавим страницу отображения наших записей в новый файл Events.html :
Events > class="container text-center"> href=">"> Добавить событие class="mt-4"> class="list-group"> class="list-group-item"> >
В файл app.py добавим view :
@app.route("/events") def view_events(): events = Event.query.order_by(Event.date).all() return render_template("events.html", h1 = "События", events=events)
А в основном контейнере index.html добавим ссылку на эту страницу:
Наш тестовый проект на Flask готов! Его можно запустить на локальном сервере через команду python app.py (в некоторых случаях надо будет написать название директории перед названием файла app.py ).
Что еще почитать про Flask
- Большой курс по Flask на Хекслете
- Документация Flask
- Цикл статей на Real Python
- Проектирование RESTful API с помощью Python и Flask
Изучите Python на Хекслете Пройдите нашу профессию «Python-разработчик», чтобы поменять свою жизнь и стать бэкенд-программистом.
Безопасная разработка на Python. Часть 3.О фреймворке Flask

В предыдущих статьях мы подробно рассмотрели основные проблемы безопасности, с которыми может столкнуться разработчик при создании своих приложений на Python. В этой статье мы продолжим рассмотрение данной темы и поговорим о работе с фреймворками, написанными на Python и теми проблемами в области безопасности, с которыми может столкнуться использующий их разработчик.
Фреймворк Flask
Flask является одним из самых распространенных фреймворков, написанных на Python. По сути, это упрощенная платформа Python для веб-приложений, которая обеспечивает основные возможности маршрутизации URL-адресов и визуализации страниц. Flask также называют микроплатформой, так как она не предоставляет напрямую такие функции, как проверка форм, абстракция базы данных, проверка подлинности и т. д. Эти функции предоставляются специальными пакетами Python, называемыми расширениями Flask.
Основным файлом, отвечающим за отображение веб контента является файл app/routes.py. Вот один из простейших вариантов его содержимого:
from app import app @app.route('/') @app.route('/index') def index(): return "Hello, World!"
Первые две строки со знаком @ это декораторы, которые изменяют функцию, следующую за ним. То есть, декоратор @app.route создает связь между URL-адресом, заданным как аргумент, и функцией. Так, у нас два декоратора, которые связывают URL-адреса / и /index с этой функцией. Это означает, что, если веб-браузер запрашивает один из этих двух URL-адресов, Flask будет вызывать эту функцию и передавать возвращаемое значение обратно в браузер в качестве ответа.
В результате, после запуска Flask, при обращении к / или /index в браузере будет выведена строка Hello, World!
Когда что-то пошло не так…
Однако, как и любой другой фреймворк, Flask не лишен уязвимостей и далее мы рассмотрим некоторые из них. Начнем со старой доброй уязвимости из OWASP TOP 10 – Cross Site Scripting, XSS. Для начала рассмотрим следующий пример кода.
From flask import Flask, render_template, request from app import app from app.forms import LoginForm # . @app.route('/login', methods=['GET', 'POST']) def login(): parameter = request.args.get('parameter','') return render_template("template.html", data=parameter)
Как видно, здесь у нас присутствует render_template, который отображает в файле template.html значение data. При этом, само значение data мы получаем из значения parameter, переданного пользователем в адресной строке браузера. Файл template.html при этом имеет следующий вид:
Flask template >
Значение data у нас отображается внутри тега . Казалось бы, все должно быть хорошо. Передадим в адресной строке значение 12345.

Все успешно отобразилось. Но вернемся к межсайтовому скриптингу. XSS это такой тип атак, которые позволяют злоумышленнику внедрять вредоносный код через веб-сайт в браузеры других пользователей. При этом у нас не происходит взлома как такового на стороне сервера. Мы просто сохраняем код скрипта, например в гостевой книге на данном сайте, а в браузерах всех других посетителей при открытии данной записи выполняется сохраненный злоумышленниками код на Javascript. В качестве примера, рассмотрим следующий код:
В результате выполнения данного скрипта в браузере отображается окно с сообщением XSS_Vulnerable! В реальности используемые в XSS скрипты могут ввести, например, на фишинговые страницы.
Теперь попробуем передать такой скрипт нашему Flask и посмотрим на его реакцию.

Как видно, наш Flask код уязвим для межсайтового скриптинга, что не очень хорошо.
Лечение
Для того, чтобы излечить наш код от такой древней уязвимости можно воспользоваться специальными библиотеками, например Escape. Данная библиотека не позволяет выполнить код в тех данных, которые передал пользователь, даже если он синтаксически полностью корректен.
Немного изменим наш код, добавив в него использование Escape:
from flask import Flask, render_template, request from flask import escape from app import app from app.forms import LoginForm # . @app.route('/login', methods=['GET', 'POST']) def login(): parameter = escape(request.args.get('parameter','')) return render_template("templates.html", data=parameter)
И посмотрим результат:

Теперь наш скрипт стал обычной текстовой строкой.
Перенаправляем не туда
Еще одним полезным свойством Flask является возможность перенаправления пользователя на веб страницу, переданную ему в качестве параметра. Рассмотрим следующий код:
from flask import Flask, render_template, request, Response from app import app from app.forms import LoginForm # . @app.route('/url/') def change_location(url): response = Response() headers = response.headers headers["location"] = url return response.headers["location"]
Здесь у нас осуществляется перенаправление пользователя на страницу, переданную в url. Однако, мы вряд ли хотим, чтобы с нашего сайта пользователи могли переходить на различные сомнительные ресурсы. Соответственно, нам было неплохо проверять передаваемые значения на соответствие некоторому списку разрешенных ресурсов. Посмотрим, как это можно было бы сделать.
from flask import Flask, render_template, request, Response from app import app from app.forms import LoginForm # . valid_locations = ['ya.ru', 'mail.ru',’rbc.ru’] @app.route('/url/') def change_location(url): response = Response() headers = response.headers sanitizedLocation = getSanitizedLocation(url) headers["location"] = "http://" + sanitizedLocation return response.headers["location"] def getSanitizedLocation(location): return location if (location in valid_locations) else "check_url"
Здесь в списке valid_locations у нас указаны веб сайты, на которые можно осуществлять перенаправление. Для всех прочих ресурсов мы вместо перенаправления будем получать сообщения check_url. Также в случае, если пользователь укажет некорректное или несуществующее имя сайта, будет выведено данное сообщение. Таким образом, мы можем ограничить перенаправление на сомнительные ресурсы.
Про отладку
Как и в других системах программирования и фреймворках, в Flask крайне не рекомендуется включать режим отладки в продуктовой среде. Использование данного режиме может быть оправдано при разработке и отладке кода, так этот режим позволяет своевременно выявлять и устранять ошибки в коде.
Однако, недопустимо, когда в случае ошибки пользователю выдаются сообщения, подобные приведенным ниже:

Необходимо, чтобы в случае сбоев, пользователю выводилась стандартная заглушка, уведомляющая о некорректной работе приложения, а не полный лог с указанием путей к библиотекам и строк, содержащих ошибки.
Заключение
Фреймворк Flask является мощным и полезным инструментом, предназначенным для быстрого создания веб ресурсов на Python. Но, как любой другой язык он содержит некоторые уязвимости, о которых необходимо помнить при разработке.
Напоследок хочу порекомендовать бесплатный вебинар от OTUS в рамках которого поговорим о том:
- что такое IDE и какие IDE существуют;
- как настроить самую полнофункциональную IDE для Python
- PyCharm Community Edition;
- версии Python, почему их так много;
- как разрабатывать несколько проектов на одной машине (что нужно учитывать, зачем нужны виртуальные среды (venv) для проектов) и что это такое;
- как запустить приложение в Docker-контейнере (зачем это делать, как это можно сделать, что нужно учесть).
В результате вы сможете организовать изолированную среду для разработки и запуска приложения с помощью venv и docker, узнаете почему существуют различные версии Python, и как организовать свое рабочее место, чтобы разрабатывать несколько различных проектов, использующих разные версии Python и сторонних пакетов, одновременно, и без боли.
Декоратор @route() и метод add_url_rule() приложения Flask Python
Декоратор @app.route() и метод app.add_url_rule() регистрируют URL-адрес, по которому будет доступно соответствующее представление и вызываются экземпляром приложения app фреймворка Flask.
Содержание:
- Декоратор экземпляра приложения @app.route() .
- Метод экземпляра приложения app.add_url_rule() .
- Список аргументов @app.route() и app.add_url_rule() .
@app.route(rule, **options) :
Декоратор @app.route() регистрирует URL-адрес, по которому будет доступно соответствующее представление (расположенное под декоратором), а так же правила маршрутизации входящих запросов. Этот декоратор вызывает метод app.add_url_rule() , реализация которого рассматривается более подробно.
@app.route("/") def index(): return "Hello, World!"
Правила маршрутизации входящих запросов (переменные части маршрута) указанные в угловых скобках передаются в соответствующую функцию-представление в качестве аргументов.
@app.route("`//`") def user(user, username): return f"Hello, username>! ID-user: user>"
Если аргумент endpoint не определен, то по умолчанию в качестве имени конечной точки для маршрута используется имя функции-представления.
Подробное описание аргументов, которые принимает декоратор @app.route() смотрите ниже.
Декоратор @app.route() вызывается экземпляром приложения фреймворка Flask.
app.add_url_rule(rule, endpoint=None, view_func=None, provide_automatic_options=None, **options) :
Метод app.add_url_rule() регистрирует URL-адрес, по которому будет доступно соответствующее представление, а так же правила маршрутизации входящих запросов. Декоратор @app.route() — это ссылка для вызова этого метода с аргументом view_func (функция-представление). Они эквивалентны:
@app.route("/") def index(): . # эквивалентно def index(): . app.add_url_rule("/", view_func=index)
Правила маршрутизации входящих запросов (переменные части маршрута), указанные в угловых скобках, передаются в соответствующую функцию-представление в качестве аргументов.
def index(id): . app.add_url_rule("/user/", view_func=index)
Если аргумент endpoint не передан, то по умолчанию, в качестве имени конечной точки маршрута используется имя функции-представления. Если функция-представление уже была зарегистрирована для конечной точки, то будет вызвана ошибка.
По умолчанию для аргумента methods установлено значение [‘GET’] . HTTP-метод HEAD всегда добавляется автоматически, а HTTP-метод OPTIONS добавлен в настройках по умолчанию.
Аргумент view_func не всегда нужно передавать, но если правило участвует в маршрутизации, то имя конечной точки endpoint должно быть связано с функцией-представлением декоратором @app.endpoint() .
app.add_url_rule("/", endpoint="index") @app.endpoint("index") def index(): .
Если функция-представления имеет атрибут required_methods , то HTTP-методы, указанные в этом атрибуте, добавляются к переданным в app.add_url_rule() HTTP-методам. Если у функции-представления есть атрибут provide_automatic_options , то он используется по умолчанию, если одноименный аргумент не определен.
def index(): if request.method == 'OPTIONS': # обработка запроса . return 'Hello World!' # присваиваем атрибуты функции-представлению index.provide_automatic_options = False index.methods = ['GET', 'OPTIONS'] # атрибуты функции `index()` передаются # в качестве аргументов app.add_url_rule('/', index)
Подробнее об атрибутах, которые может иметь функция-представление, смотрите в материале «Представления в веб-приложении на Flask».
Список аргументов декоратора @app.route() и метода app.add_url_rule() .
Ниже приведены аргументы, которые принимают декоратор @app.route() и метод app.add_url_rule() . Единственное отличие состоит в том, что аргумент view_func в декораторе @app.route() отсутствует, так как за декоратором следует функция-представление, которая и заменяет этот аргумент.
- rule : правило URL-адреса в виде строки;
- endpoint : конечная точка для зарегистрированного правила URL-адреса. Сам Flask предполагает, что имя функции-представления является именем конечной точки, если явно она не задана;
- view_func : функция, вызываемая при обслуживании запроса к предоставленной конечной точке. Если это не предусмотрено, то можно указать функцию позже, сохранив ее в словаре view_functions с конечной точкой в качестве ключа.
- defaults : словарь с настройками по умолчанию для этого правила.
@app.route('/users/', defaults='page': 1>) @app.route('/users/page/') def show_users(page): pass
from flask import Flask app = Flask(__name__, subdomain_matching=True) app.config['SERVER_NAME'] = "example.com" @app.route("/") def index(): return "example.com" @app.route("/", subdomain="") def sub_index(subdomain): return f'subdomain>.example.com'
- methods=[‘GET’] : это список методов, которым должен быть ограничен маршрут ( GET , POST и т. д.). По умолчанию правило просто прослушивает GET (и неявно HEAD ). Начиная с Flask 0.6, OPTIONS неявно добавляются и обрабатываются стандартными запросами.
- redirect_to : если задано, то это должно быть либо строка URL, либо вызываемая функция-представление. В случае вызываемого объекта, он вызывается с адаптером URL, который инициировал сопоставление, и значениями URL в качестве ключевых аргументов и должны возвращать цель для перенаправления, в противном случае это должна быть строка маршрута:
# Функция, которая генерирует новые URL-адреса def foo_with_slug(adapter, id): # запросить в базе данных `id` для старого идентификатора. return f'foo/Foo.get_slug_for_id(id)>' @blueprint.route('/foo/') def all(page): . # правила перенаправлений на новые URL-адреса app.add_url_rule('/some/old/url/', redirect_to='foo/') app.add_url_rule('/other/old/url/', redirect_to=foo_with_slug)
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Пример структуры приложения Flask как пакета Python
- Модульные приложения на схемах blueprint во Flask Python
- Фабрика веб-приложений модуля Flask
- Представления в веб-приложении на Flask Python
- Правила составления URL-маршрутов во Flask Python
- Использование шаблонизатора Jinja2 в приложении Flask Python
- Пользовательские страницы HTTP-ошибок на Flask Python
- Выполнение кода до или после запроса во Flask Python
- Загрузка файлов на сервер во Flask Python
- Всплывающие сообщения в приложении на Flask Python
- Извлечение данных из запроса во Flask Python
- Хранение и загрузка конфигураций Flask
- Параметры/ключи конфигурации, используемые во Flask
- Папки экземпляров приложений на Flask
- Контекст веб-приложения на Flask
- Контекст запроса приложения на Flask
- Ведение журнала логов в приложении Flask Python
- Собственные декораторы в приложении Flask Python
- Класс Config() модуля flask
- Функция redirect модуля flask
- Функция url_for() модуля flask
- Прокси-объект current_app() модуля flask
- Функция abort() модуля flask
- Отладочные сигналы приложения Flask
- Работа с cookie в приложении на Flask Python
- Безопасность веб-приложения на Flask
- Асинхронность в веб-приложении на Flask
- Использование URL-процессора в приложениях на Flask Python
- Диспетчеризация приложений на Flask
- Функция make_response модуля flask
- Доступность контекстов запроса/приложения во Flask Python
- Декоратор @route() и метод add_url_rule() приложения Flask Python
- Функция send_file() модуля flask
- Функция send_from_directory() модуля flask
- Как обслуживать статические файлы в Flask Python
- Функция render_template() модуля flask
- Класс Markup() модуля flask
- Отложенная загрузка представлений в приложении Flask Python
- Сессии/сеансы sessions модуля flask
- Глобальный объект flask.g в приложении Flask Python
- Класс Request() модуля flask
- Класс Response() модуля flask
- Класс Flask() модуля flask
- Тестирование приложений на Flask
- Использование SQLite 3 в приложении Flask Python
- Генерация своей капчи на сайте Flask
- Использование модуля WTForms в приложении Flask Python
- Расширение Flask-Caching для приложения Flask
- Расширение Flask-Assets, управление статикой приложения
- Расширение Flask-WTF для приложения Flask
- Расширение Flask-SQLAlchemy для приложения Flask
- Расширение Flask-Paginate для приложения Flask
- Расширение Flask-Mail для приложения Flask
- Расширение Flask-APScheduler
- Связка Nginx + Gunicorn + Gevent + Flask Python
- Как передать переменную NGINX во Flask environ
- Защита приложения/сайта от DDoS атак