Подтвердить что ты не робот

Маркер с кодировкой URI

Кажется, Flask не поддерживает маршруты с кодированным URI компонентом. Мне интересно, если я делаю что-то неправильно, или если есть специальный флаг, который мне нужно включить.

Мой маршрут выглядит примерно так:

@app.route('/foo/<encoded>/bar/')
def foo(encoded):
  # ...
  pass

URL-адрес, который должен соответствовать, может выглядеть так:

http://foobar.com/foo/xxx/bar/ # matched correctly, no URI component
http://foobar.com/foo/x%2Fx%2Fx%2F/bar/ # not matched correctly, URI component

Бывший URL работает, последний выплескивает прекрасную 404.

Спасибо!

4b9b3361

Ответ 1

Добавьте path в правило вашего URL:

@app.route('/foo/<path:encoded>/bar/')

Обновление за комментарий: Документы API маршрута находятся здесь: http://flask.pocoo.org/docs/api/#flask.Flask.route. Ниже приведены классы, которые реализуют конвертер маршрутов стиля path: http://werkzeug.pocoo.org/docs/routing/#custom-converters (это одна из очень приятных частей pocoostan.) Что касается конечных косых черт, существуют специальные правила, которые составляют:

Если правило заканчивается косой чертой и запрашивается без косой черты пользователя, пользователь автоматически перенаправляется на ту же страницу с помощью прикрепленная клейкая косая черта.

Если правило не заканчивается конечной косой чертой, а запрос пользователя страница с завершающей косой чертой, 404 не найдена.

Также имейте в виду, что если вы находитесь в Apache и ожидаете привязку с косой чертой, то есть букмарклет, который отправляется в http://ex.com/foo/<path:encoded>/bar и encoded, получает что-то с двойной косой чертой, Apache будет конвертировать несколько слэшей в один.