Конвертер int
Конвертер int указывается в угловых скобках маршрута после двоеточия и применяется к именованному параметру URL. Он принимает из адреса только целые числа, а в функцию-обработчик передаёт уже готовое значение типа int. Если сегмент URL не является целым числом, Flask не вызовет обработчик и вернёт ошибку 404.
Синтаксис параметра выглядит так: <int:name>, где int - имя конвертера, а name - имя аргумента функции-обработчика. По умолчанию, если конвертер не указан, Flask использует конвертер string, который принимает любые символы, кроме слэша, и передаёт их как строку.
Конвертер int поддерживает только положительные целые числа без знака. Отрицательные числа, числа с плавающей точкой и числа с ведущими нулями не принимаются. Например, адрес /user/12 подойдёт, а /user/12.5 или /user/-3 - нет.
Синтаксис
@app.route('/path/<int:name>')
Пример
Давайте повесим обработчик на адрес с целочисленным параметром id:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<int:id>')
def user(id):
return f'User ID: {id}, type: {type(id).__name__}'
Результат выполнения кода для адреса /user/12:
User ID: 12, type: int
Пример
Давайте попробуем передать в параметр id не целое число:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<int:id>')
def user(id):
return f'User ID: {id}'
Результат выполнения кода для адреса /user/abcde:
404 Not Found
Flask не вызывает функцию-обработчик, потому что значение abcde не является целым числом, и возвращает страницу 404.
Пример
Давайте сложим два целочисленных параметра из URL:
from flask import Flask
app = Flask(__name__)
@app.route('/sum/<int:a>/<int:b>')
def total(a, b):
return str(a + b)
Результат выполнения кода для адреса /sum/2/3:
5
Пример
Давайте используем целочисленный параметр в шаблоне:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/article/<int:id>')
def article(id):
return render_template('article.html', id=id)
Файл шаблона:
<p>Article number: {{ id }}</p>
Результат выполнения кода для адреса /article/7:
<p>Article number: 7</p>