Запросы.

Маршрутизатор уже берёт на себя часть обработки запросов — выбирает, какой обработчик вызвать в зависимости от пути. Но запросы характеризуются не только путями, но и методами (methods), и параметрами (parameters). При написании web-приложений нужно уметь работать с этими (и многими другими) свойствами запросов.

Все свойства текущего запроса можно получить в теле обработчика с помощью "магического" глобального объекта request:

from flask import request

@app.route('/echo/')
def echo():
    print(request.path)  # => '/echo/'
    return request.data

Методы HTTP.

Первое свойство запроса, на которое смотрят сразу после разбора пути, это метод. Вы уже проходили методы в курсе по протоколу HTTP. Напомню, методы — это такие строки вроде "GET" и "POST", описывающие то, как сервер должен реагировать на запрос.

В коде обработчика вы всегда можете обратиться к request.method и выбрать, как вы хотите обрабатывать каждый метод. Но часто гораздо удобнее иметь отдельные обработчики для разных методов. Маршрутизатор Flask даёт такую возможность:

@app.route('/users/', methods=['GET'])
def get_users():
    # ...

@app.route('/users/', methods=['POST', 'PUT'])
def post_users():
    # ...

Параметры.

Запросы могут быть параметризованы с помощью query string или с помощью form data. К первым доступ можно получить с помощью атрибута request.args:

user_id = request.args.get('user', None)

За вторые отвечает атрибут request.form:

username = request.form['username']
password = request.form['password']

И args, и form внешне похожи на словари, но иммутабельны. А ещё они позволяют иметь несколько значений для каждого ключа. Так, для запроса с параметрами ?a=1&a=2 вы можете получить первое значение параметра 'a', обратившись напрямую по ключу, весь же набор значений даст метод getlist. Пример:

request.args['a']          # '1'
request.args.getlist('a')  # ['1', '2']

Другие свойства запросов.

Я не описал работу с заголовками и cookies, не рассказал про MIME-types и другие атрибуты настоящих HTTP-запросов потому, что документация покрывает эти темы хорошо, да и работать с этими свойствами запросов приходится реже.

Полный перечень свойств объекта request вы можете посмотреть в документации.

Магичность объекта request.

Вы могли подумать, как же request, который мы импортируем из общедоступного модуля — то есть тоже общедоступный объект, может хранить данные конкретного запроса? Это от нас скрывает машинерия фреймворка. Вам нужно лишь помнить, что запрос всегда для каждого обработчика "свой" и данные разных запросов не перемешиваются, даже если одновременно происходит обработка нескольких запросов! Если же вы очень уж заинтересуетесь тем, как такая магия реализована в коде, то я, опять же, посоветую почитать документацию Flask. Но предупреждаю, это непростая тема :)

Задание.

  1. Добавьте в ваше приложение маршрут /args.
  2. Реализуйте обработчик для этого маршрута, возвращающий HTML-страницу c таблицей.
  3. Выводите в таблицу имена и значения параметров из query string. Помните о том, что каждый параметр может иметь несколько значений.
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →