Как работает Flask Routing
Вся идея Flask (и базовой библиотеки Werkzeug) состоит в том, чтобы сопоставить URL-пути с некоторой логикой, которую вы будете запускать (обычно, «функция просмотра»). Ваш основной вид определяется так:
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Обратите внимание, что упомянутая вами функция (add_url_rule) достигает той же цели, только без использования нотации декоратора. Следовательно, то же самое:
# No "route" decorator here. We will add routing using a different method below.
def give_greeting(name):
return 'Hello, {0}!'.format(name)
app.add_url_rule('/greeting/<name>', 'give_greeting', give_greeting)
Допустим, ваш веб-сайт расположен по адресу «www.example.org» и использует представление, указанное выше. Пользователь вводит в свой браузер следующий URL:
http://www.example.org/greeting/Mark
Задача Flask - взять этот URL-адрес, выяснить, что пользователь хочет сделать, и передать его для обработки одной из ваших многочисленных функций Python. Он идет по пути :
/greeting/Mark
... и сопоставляет его со списком маршрутов. В нашем случае мы определили этот путь для перехода к give_greeting
функции.
Однако, хотя это типичный способ создания представления, он фактически отвлекает от вас некоторую дополнительную информацию. За кулисами Flask не переходил напрямую от URL к функции просмотра, которая должна обрабатывать этот запрос. Это не просто говорит ...
URL (http://www.example.org/greeting/Mark) should be handled by View Function (the function "give_greeting")
Фактически, есть еще один шаг, на котором он сопоставляет URL-адрес конечной точке:
URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "give_greeting".
Requests to Endpoint "give_greeting" should be handled by View Function "give_greeting"
По сути, «конечная точка» - это идентификатор, который используется для определения логической единицы вашего кода, которая должна обрабатывать запрос . Обычно конечная точка - это просто имя функции просмотра. Однако вы можете фактически изменить конечную точку, как это сделано в следующем примере.
@app.route('/greeting/<name>', endpoint='say_hello')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Теперь, когда Flask маршрутизирует запрос, логика выглядит так:
URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "say_hello".
Endpoint "say_hello" should be handled by View Function "give_greeting"
Как вы используете конечную точку
Конечная точка обычно используется для «обратного просмотра». Например, в одном представлении вашего приложения Flask вы хотите сослаться на другое представление (возможно, когда вы переходите из одной области сайта в другую). Вместо того, чтобы жестко кодировать URL-адрес, вы можете использовать url_for()
. Предположим следующее
@app.route('/')
def index():
print url_for('give_greeting', name='Mark') # This will print '/greeting/Mark'
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Это выгодно, так как теперь мы можем изменять URL-адреса нашего приложения без необходимости изменять строку, в которой мы ссылаемся на этот ресурс.
Почему бы просто не использовать имя функции просмотра?
Может возникнуть следующий вопрос: «Зачем нам нужен этот дополнительный слой?» Зачем отображать путь к конечной точке, а затем конечную точку к функции просмотра? Почему бы просто не пропустить этот средний шаг?
Причина в том, что так он более мощный. Например, Flask Blueprints позволяет разделить приложение на несколько частей. У меня могут быть все мои административные ресурсы в схеме под названием «admin», а все мои ресурсы пользовательского уровня - в конечной точке под названием «user».
Чертежи позволяют разделить их на пространства имен. Например...
main.py:
from flask import Flask, Blueprint
from admin import admin
from user import user
app = Flask(__name__)
app.register_blueprint(admin, url_prefix='admin')
app.register_blueprint(user, url_prefix='user')
admin.py:
admin = Blueprint('admin', __name__)
@admin.route('/greeting')
def greeting():
return 'Hello, administrative user!'
user.py:
user = Blueprint('user', __name__)
@user.route('/greeting')
def greeting():
return 'Hello, lowly normal user!'
Обратите внимание на то, что в обоих схемах маршрут «/ приветствие» является функцией, называемой «приветствием». Если бы я хотел обратиться к функции «приветствия» администратора, я не мог бы просто сказать «приветствие», потому что есть также функция «приветствие» пользователя. Конечные точки допускают своего рода пространство имен, если вы указываете имя схемы как часть конечной точки. Итак, я мог сделать следующее ...
print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'
url_for
рута? Я поймал ошибкуCould not build url for endpoint ''