Структура URL и форма сообщений с Flask

В 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 ответ

Решение

Параметры запроса не включаются как часть сопоставления маршрута и не вводятся в аргументы функции. Только соответствующие части URL вводятся. То, что вы ищете, это request.args (Получить параметры запроса), 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)

И так далее.

Другие вопросы по тегам