Як працює 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-адреси нашої програми, не змінюючи рядок, де ми посилаємося на цей ресурс.
Чому б не завжди використовувати назву функції перегляду?
Одне запитання, яке може виникнути, наступне: "Навіщо нам потрібен цей додатковий шар?" Чому відображення шляху до кінцевої точки, а потім кінцевої точки до функції перегляду? Чому б просто не пропустити цей середній крок?
Причина в тому, що вона є більш потужною. Наприклад, Флашмарові креслення дозволяють розділити додаток на різні частини. У мене можуть бути всі мої ресурси адміністратора в кресленні під назвою "адміністратор", а всі мої ресурси на рівні користувача в кінцевій точці, що називається "користувач".
Креслення дозволяють розділити їх на простори імен. Наприклад...
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
for root? ЯCould not build url for endpoint ''