BoyFromDubai, тебе же ясно написали:
бразуеры при открытии страницы сайта делают дополнительный запрос к сайту, чтобы получить favicon. Этот запрос прилетает в ваш обработчик block.
Т.е. запрос на
/favicon.ico
браузер сделает по своей инициативе, и тебе придётся с этим иметь дело. Вообще на будущее имей ввиду, что клиент может сделать любой бредовый запрос, так что ВСЕГДА нужно проверять, что тебе пришло.
Возможных решений 3.
1. Сменить url запроса, например так.
@views.route('/block/<height>', methods=['GET'])
Тогда у тебя запрос не будет конфликтовать с запросом favicon, но всё ещё будет ломаться, если клиент запросит
/block/foobar
вместо
/block/123
2. Указать тип параметра
@views.route('/<height: int>', methods=['GET'])
Тогда фреймворк отфильтрует нечисловые запросы, и сам преобразует стркоу в число. Это умеет и Django, и Flask. Но запрос сломается, если полученное число не будет корректным индексом/ключом для chain[].
3. Вставить try-except
try:
block = blockchain.chain[int(height) - 1]
except (ValueError, LookupError):
# ловим ValueError от вызова int() и возможный LookupError от обращения к chain[]
# хотя я фз что ещё может выбросить chain[]
return "ОШИБКА БЛИН" # ну или более подробное сообщение об ошибке
else:
from main import blockchain
return render_template("block.html", block = block, blockchain=blockchain)
Я бы посоветовал сочетание методов 2 и 3. Пусть преобразованием в int занимается Flask, но всё же проверь, подходит ли это число.