Опциональные параметры URL во Flask: как объявить?

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Да, во Flask можно создать маршрут с необязательными параметрами URL, установив для этих параметров значения по умолчанию. Для этого следует при использовании декоратора @app.route() применить defaults={'param': None}. В функции-обработчике делается проверка на наличие данного параметра. Вот пример реального кода:

Python
Скопировать код
from flask import Flask

app = Flask(__name__)

@app.route('/stuff', defaults={'stuff_id': None})  # Если stuff_id не предоставлен...
@app.route('/stuff/<stuff_id>')  # ...то становится активным значение по умолчанию
def get_stuff(stuff_id):
    if stuff_id:
        return f'ID вещи: {stuff_id}'
    else:
        return "Ой, где мне искать ваши вещи?"  # Ведь у каждого должен быть свой список вещей, не так ли?

if __name__ == '__main__':
    app.run()  # Запускаем выполнение кода!

В этом случае адрес /stuff обработается корректно как с предоставленным stuff_id, так и без него.

Кинга Идем в IT: пошаговый план для смены профессии

Использование нескольких декораторов для уменьшения дублирования кода

Flask позволяет использовать несколько декораторов маршрутизации, что удобно для работы с маршрутами, включающими необязательные параметры, и облегчает избегание дублирования кода. Вот пример имитации пагинации на блоге:

Python
Скопировать код
@app.route('/blog', defaults={'page': 1})  # Пагинация начинается с первой страницы.
@app.route('/blog/page/<int:page>')  # Это позволяет выбирать страницу.
def blog(page):
    # Здесь будет ваш код, отображающий записи блога на запрошенной странице
    pass

Инициализация параметров в объявлении функции

Простой подход к обработке необязательных параметров – их инициализация прямо в объявлении функции-обработчика. Для параметров проставляются значения по умолчанию, например None:

Python
Скопировать код
@app.route('/user/<username>')  # Запрос к профилю пользователя...
def show_user_profile(username=None):  # Теперь можно получить данные и без указания имени пользователя.
    # Логика отображения профиля пользователя или стандартного представления для неавторизованных пользователей
    pass

Работа с необязательными параметрами с помощью классов ресурсов при использовании Flask-Restful

Если вы используете Flask-Restful, классы ресурсов предлагают удобный способ работы с необязательными параметрами. Значение параметра по умолчанию можно установить и при определении ресурса:

Python
Скопировать код
from flask_restful import Resource

class UserResource(Resource):
    def get(self, username=None):  # И опять можно обойтись без имени пользователя
        # Логика обработки запроса и возврата информации или стандартного представления
        pass

Визуализация

Представьте, что у нас есть дорожка в парке:

Основная дорожка: /park/🌱

Мы идем по пути с 🌱.

Дорожки с необязательными направлениями: /park/🌱(/🦋)?(/🌼)?

Можно пойти за бабочкой 🦋 или остановиться, чтобы полюбоваться цветком 🌼, все равно продолжая движение в том же направлении.

А на языке Flask это можно представить так:

Python
Скопировать код
@app.route('/park/<plant>', defaults={'butterfly': None, 'flower': None})
@app.route('/park/<plant>/<butterfly>', defaults={'flower': None})
@app.route('/park/<plant>/<butterfly>/<flower>')

Это все вариации одного и того же пути, которые приведут нас к заветной цели. 🌱➡️🦋➡️🌼

Управление сложностью с помощью продвинутых паттернов

Для управления сложными маршрутами во Flask можно использовать продвинутые возможности и преобразователи URL. Преобразователь path: отлично подходит для создания "пропускающих" шаблонов:

Python
Скопировать код
@app.route('/file/<path:filename>', defaults={'filename': None})  # Может ли файл существовать без имени?
def files(filename):
    # Здесь будет ваш код, возвращающий определенный файл или список файлов.
    pass

Осознание поведения перенаправлений

При работе с Flask важно понимать, как осуществляется работа с перенаправлениями и URL. Маршрут, заканчивающийся на /, воспринимается как директория, и Flask может выполнить перенаправление, чтобы соответствовать заданному шаблону URL. Будьте уверены, что это не приводит к нежелательным последствиям при работе с параметрами по умолчанию.

Использование Flask-Restful и обрабатывание запросов

При использовании Flask-Resteful следует обратить внимание на reqparse или Marshmallow для точного контроля параметров запроса, включая необязательные. Это поможет значительно помочь улучшить логику валидации и обработки параметров, а также позволит создать надежный и хорошо структурированный API.

Полезные материалы

  1. Quickstart — Документация Flask (2.0.x) — официальная документация Flask с разделом о переменных в маршрутах.
  2. python – Могут ли в Flask быть необязательные параметры URL? – Stack Overflow — обсуждение механизма работы с маршрутами, имеющими необязательные параметры, во Flask.
  3. The Flask Mega-Tutorial, Часть III: Web Forms – miguelgrinberg.com — детальное пособие по работе с URL и формами во Flask.
  4. API — Документация Flask (2.0.x) — подробное описание взаимодействия с параметрами запроса Flask.
  5. Flask Tutorials – Real Python — ряд уроков по работе с Flask для начинающих и продвинутых пользователей.
  6. Advanced patterns for views and routing — Explore Flask 1.0 documentation — дополнительное пособие по работе с продвинутыми паттернами маршрутизации, включая использование необязательных параметров.
  7. Search · flask route optional parameters · GitHub — реальные примеры кода по работе с необязательными параметрами маршрутов во Flask.