Поиск…


Основные маршруты

Маршруты в колбе могут быть определены с помощью декодера route экземпляра приложения «Колба»:

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Flask'

Декоратор route берет строку, которая соответствует URL-адресу. Когда запрос URL-адреса, который соответствует этой строке, будет получен приложением, функция, украшенная (также называемая функцией просмотра ), будет вызываться. Итак, по поводу маршрута мы будем иметь:

@app.route('/about')
def about():
    return 'About page'

Важно отметить, что эти маршруты не являются регулярными выражениями, как в Django.

Вы также можете определить правила переменных для извлечения значений сегмента URL в переменные:

@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id):
    # look up the blog post with id post_id
    # return some kind of HTML

Здесь правило переменной находится в последнем сегменте URL-адреса. Какое бы значение в последнем сегменте URL-адреса не передавалось функции просмотра ( get_blog_post ) в качестве параметра post_id . Поэтому запрос /blog/posts/42 будет извлекать (или пытаться восстановить) сообщение в блоге с идентификатором 42.

Также часто используется повторное использование URL-адресов. Например, возможно, мы хотим, чтобы /blog/posts возвращали список всех сообщений в блоге. Таким образом, у нас может быть два маршрута для одной и той же функции просмотра:

@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
    # get the post or list of posts

Обратите внимание, что мы также должны предоставить значение по умолчанию None для post_id в get_blog_post . Когда первый маршрут будет согласован, не будет никакого значения для передачи функции просмотра.

Также обратите внимание, что по умолчанию тип правила переменной является строкой. Однако вы можете указать несколько различных типов, таких как int и float путем префикса переменной:

@app.route('/blog/post/<int:post_id>')

Встроенные URL-конвертеры Flask:

string | Accepts any text without a slash (the default).
int    | Accepts integers.
float  | Like int but for floating point values.
path   | Like string but accepts slashes.
any    | Matches one of the items provided
uuid   | Accepts UUID strings

Если мы попытаемся посетить URL /blog/post/foo со значением в последнем сегменте URL, который не может быть преобразован в целое число, приложение вернет ошибку 404. Это правильное действие, потому что не существует правила с /blog/post и строкой в ​​последнем сегменте.

Наконец, маршруты могут быть настроены так же, как и HTTP-методы. Декоратор route принимает аргумент ключевого слова methods который представляет собой список строк, представляющих приемлемые HTTP-методы для этого маршрута. Как вы могли предположить, по умолчанию используется только GET . Если бы у нас была форма добавления нового сообщения в блоге и мы хотели вернуть HTML для запроса GET и проанализировать данные формы для запроса POST , маршрут будет выглядеть примерно так:

@app.route('/blog/new', methods=['GET', 'POST'])
def new_post():
    if request.method == 'GET':
        # return the form
    elif request.method == 'POST':
        # get the data from the form values

request находится в упаковке flask . Обратите внимание, что при использовании аргумента ключевого слова methods мы должны быть явным о методах HTTP, которые нужно принять. Если бы мы указали только POST , маршрут больше не будет отвечать на запросы GET и вернуть ошибку 405.

Поймать весь маршрут

Может быть полезно иметь один общий вид, где вы сами обрабатываете сложную логику на основе пути. В этом примере используются два правила: первое правило специально улавливает / а второе правило ловит произвольные пути со встроенным преобразователем path . Конвертер path соответствует любой строке (включая косые черты). См. Правила переменной фляжки

@app.route('/', defaults={'u_path': ''})
@app.route('/<path:u_path>')
def catch_all(u_path):
    print(repr(u_path))
    ...
c = app.test_client()
c.get('/')  # u_path = ''
c.get('/hello')  # u_path = 'hello'
c.get('/hello/stack/overflow/')  # u_path = 'hello/stack/overflow/'

Методы маршрутизации и HTTP

По умолчанию маршруты отвечают только на запросы GET . Вы можете изменить это поведение, предоставив аргумент methods декоратору route() .

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

Вы также можете отображать различные функции в одну и ту же конечную точку на основе используемого метода HTTP.

@app.route('/endpoint', methods=['GET'])
def get_endpoint():
    #respond to GET requests for '/endpoint'


@app.route('/endpoint', methods=['POST', 'PUT', 'DELETE'])
def post_or_put():
    #respond to POST, PUT, or DELETE requests for '/endpoint'


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow