Опциональные параметры URL во Flask: как объявить?
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Да, во Flask можно создать маршрут с необязательными параметрами URL, установив для этих параметров значения по умолчанию. Для этого следует при использовании декоратора @app.route()
применить defaults={'param': None}
. В функции-обработчике делается проверка на наличие данного параметра. Вот пример реального кода:
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
, так и без него.
Использование нескольких декораторов для уменьшения дублирования кода
Flask позволяет использовать несколько декораторов маршрутизации, что удобно для работы с маршрутами, включающими необязательные параметры, и облегчает избегание дублирования кода. Вот пример имитации пагинации на блоге:
@app.route('/blog', defaults={'page': 1}) # Пагинация начинается с первой страницы.
@app.route('/blog/page/<int:page>') # Это позволяет выбирать страницу.
def blog(page):
# Здесь будет ваш код, отображающий записи блога на запрошенной странице
pass
Инициализация параметров в объявлении функции
Простой подход к обработке необязательных параметров – их инициализация прямо в объявлении функции-обработчика. Для параметров проставляются значения по умолчанию, например None
:
@app.route('/user/<username>') # Запрос к профилю пользователя...
def show_user_profile(username=None): # Теперь можно получить данные и без указания имени пользователя.
# Логика отображения профиля пользователя или стандартного представления для неавторизованных пользователей
pass
Работа с необязательными параметрами с помощью классов ресурсов при использовании Flask-Restful
Если вы используете Flask-Restful, классы ресурсов предлагают удобный способ работы с необязательными параметрами. Значение параметра по умолчанию можно установить и при определении ресурса:
from flask_restful import Resource
class UserResource(Resource):
def get(self, username=None): # И опять можно обойтись без имени пользователя
# Логика обработки запроса и возврата информации или стандартного представления
pass
Визуализация
Представьте, что у нас есть дорожка в парке:
Основная дорожка: /park/🌱
Мы идем по пути с 🌱.
Дорожки с необязательными направлениями: /park/🌱(/🦋)?(/🌼)?
Можно пойти за бабочкой 🦋 или остановиться, чтобы полюбоваться цветком 🌼, все равно продолжая движение в том же направлении.
А на языке Flask это можно представить так:
@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:
отлично подходит для создания "пропускающих" шаблонов:
@app.route('/file/<path:filename>', defaults={'filename': None}) # Может ли файл существовать без имени?
def files(filename):
# Здесь будет ваш код, возвращающий определенный файл или список файлов.
pass
Осознание поведения перенаправлений
При работе с Flask важно понимать, как осуществляется работа с перенаправлениями и URL. Маршрут, заканчивающийся на /
, воспринимается как директория, и Flask может выполнить перенаправление, чтобы соответствовать заданному шаблону URL. Будьте уверены, что это не приводит к нежелательным последствиям при работе с параметрами по умолчанию.
Использование Flask-Restful и обрабатывание запросов
При использовании Flask-Resteful следует обратить внимание на reqparse
или Marshmallow
для точного контроля параметров запроса, включая необязательные. Это поможет значительно помочь улучшить логику валидации и обработки параметров, а также позволит создать надежный и хорошо структурированный API.
Полезные материалы
- Quickstart — Документация Flask (2.0.x) — официальная документация Flask с разделом о переменных в маршрутах.
- python – Могут ли в Flask быть необязательные параметры URL? – Stack Overflow — обсуждение механизма работы с маршрутами, имеющими необязательные параметры, во Flask.
- The Flask Mega-Tutorial, Часть III: Web Forms – miguelgrinberg.com — детальное пособие по работе с URL и формами во Flask.
- API — Документация Flask (2.0.x) — подробное описание взаимодействия с параметрами запроса Flask.
- Flask Tutorials – Real Python — ряд уроков по работе с Flask для начинающих и продвинутых пользователей.
- Advanced patterns for views and routing — Explore Flask 1.0 documentation — дополнительное пособие по работе с продвинутыми паттернами маршрутизации, включая использование необязательных параметров.
- Search · flask route optional parameters · GitHub — реальные примеры кода по работе с необязательными параметрами маршрутов во Flask.