структура URL и форма сообщений с Flask - PullRequest
5 голосов
/ 05 января 2012

В Flask вы пишете маршрут над объявлением метода следующим образом:

@app.route('/search/<location>/')
def search():
  return render_template('search.html')

Однако в HTML как форма будет публиковать URL-адрес таким образом

www.myapp.com/search?location=paris

последний выглядитвернуть 404 из приложения, где

www.myapp.com/search/london

вернется, как и ожидалось.

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

Если нет, каково оптимальное решение для этого сценария, так как я уверен, что 90% разработчиков должны прийти к этому моменту ...

заранее спасибо.

1 Ответ

9 голосов
/ 05 января 2012

Параметры запроса не включены как часть сопоставления маршрута и не вводятся в аргументы функции.Только совпадающие части URL вводятся.То, что вам нужно, это request.args (параметры запроса GET), request.form (POST) или request.values (вместе).

Вы можете сделать что-то подобное, если хотите поддерживать оба:

@app.route('/search/<location>')
def search(location=None):
    location = location or request.args.get('location')
    # perform search

Хотя, если вы захотите выполнить поиск по другим параметрам, возможно, лучший способ сделать это будет ближе к:

def _search(location=None,other_param=None):
    # perform search

@app.route('/search')
def search_custom():
    location = request.args.get('location')
    # ... get other params too ...
    return _search(location=location, other params ... )

@app.route('/search/<location>')
def search_location(location):
    return _search(location=location)

и т. Д.

...