Маршрут Flask с компонентом в кодировке URI - PullRequest
19 голосов
/ 18 августа 2011

Кажется, что 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.

Спасибо!

1 Ответ

26 голосов
/ 18 августа 2011

Добавьте 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 и ожидаете URL с косой чертой, то есть букмарклет, который отправляет в http://ex.com/foo/<path:encoded>/bar, а encoded получает что-то с двойной косой чертой, Apache преобразует несколько косых черт в одну. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...