URL перенаправления колб для страницы не найден (ошибка 404) - PullRequest
0 голосов
/ 16 июня 2019

Я хочу знать, каким способом лучше обрабатывать страницу не найдена ошибка 404. Поэтому я нашел два способа перенаправить страницы, когда кто-то пытается зайти на мой сайт, но они вводят URL, что у меня нет маршрутапостроен для.Первый способ - это создать обработчик ошибок, чтобы я мог сделать так:

@app.errorhandler(404)
def internal_error(error):
    return redirect(url_for('index'))

Есть второй способ, который я нашел на веб-сайте фляги, http://flask.pocoo.org/snippets/57/,, и он выглядит так:

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    return redirect(url_for('index'))

Разница в том, что один будет обрабатывать ошибку, а другой - динамическую маршрутизацию.Но что было бы лучше использовать?Я не знаю, в чем заключаются плюсы и минусы, и перед тем, как их использовать, я бы хотел лучше понять это.

Чтобы помочь, это мой базовый код:

@app.route('/', methods=["GET", "POST"])
def index():
  return render_template("HomePage.html")

if __name__ == "__main__":
  app.debug = True
  app.run()

1 Ответ

1 голос
/ 16 июня 2019

Я скажу, чтобы справиться с вашим сценарием, второй подход хорош, так как вам нужен дескриптор несуществующего маршрута

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    return redirect(url_for('index')) 

Но в общем, оба варианта имеют разные варианты использования, скажем,Вы рендерите несколько шаблонов в разных функциях, и при рендеринге вы получили исключение.Таким образом, чтобы справиться с этой ситуацией, вам нужно реализовать обработку исключений во всех методах.Впредь, вместо того, чтобы делать это и делать нашу читабельную и масштабируемую, мы можем зарегистрировать исключение с помощью этой функции и создать пользовательский ответ для пользователя, см. Ниже:

# It will catch the exception when the Template is not found and
# raise a custom response as per the rasied exception
@app.errorhandler(TemplateNotFound)
def handle_error(error):
    message = [str(x) for x in error.args]
    status_code = 500
    success = False
    response = {
        'success': success,
        'error': {
            'type': error.__class__.__name__,
            'message': message
        }
    }
    return jsonify(response), status_code

# For any other exception, it will send the reponse with a custom message 
@app.errorhandler(Exception)
def handle_unexpected_error(error):
    status_code = 500
    success = False
    response = {
        'success': success,
        'error': {
            'type': 'UnexpectedException',
            'message': 'An unexpected error has occurred.'
        }
    }

    return jsonify(response), status_code
...