@minotavr1712

Что с Traceback?

127.0.0.1 - - [05/May/2022 19:51:39] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [05/May/2022 19:51:39] "GET /static/css/base.css HTTP/1.1" 304 -
127.0.0.1 - - [05/May/2022 19:51:39] "GET /static/css/index.css HTTP/1.1" 304 -
127.0.0.1 - - [05/May/2022 19:51:39] "GET /static/js/index.js HTTP/1.1" 304 -
127.0.0.1 - - [05/May/2022 19:51:40] "GET /favicon.ico HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\minot\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2095, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\minot\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2080, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\minot\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2077, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\minot\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1525, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\minot\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1523, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\minot\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1509, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "c:\Users\minot\OneDrive\Рабочий стол\BlockPy\website\views.py", line 13, in block
    return render_template("block.html", block = blockchain.chain[int(height) - 1], blockchain=blockchain)
ValueError: invalid literal for int() with base 10: 'favicon.ico'


Что тут не так? В интернете не могу найти решения. Но все нормально работает, а ошибки выдает. Раньше такого не было, а после перезапуска VSC это выдает
  • Вопрос задан
  • 187 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
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, но всё же проверь, подходит ли это число.
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Очевидно в переменной height содержится строка 'favicon.ico', которую невозможно преобразовать в число.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы