Проблема с отображением переменных url_for в URL, если используется несколько маршрутов - PullRequest
0 голосов
/ 17 февраля 2020

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

Мой вариант использования - это API, где создается объект вернет те же данные, что и при выполнении команды GET.

Вот пример кода:

@app.route('/test', methods=['POST'])
@app.route('/test/<string:name>', methods=['GET'])
def test(name=None):
    if request.method == 'POST':
        return redirect(url_for('test', name='xyz'))
    return name

Если удаляется первый app.route, то url_for('test', name='xyz') будет правильно возвращать "test/xyz".

Однако, с обеими app.route строками, он вместо этого возвращает "test?name=xyz". Это приводит к тому, что name становится None, где переменная фактически находится в request.args['name'].

Я не хочу делать if name is None: name=request.args.get('name'), так что есть ли способ заставить его смотреть только маршруты с GET методом? Мой случай сейчас достаточно прост, я мог бы просто сделать url_for('test')+'/xyz', но кажется, что должен быть лучший способ сделать это.

1 Ответ

1 голос
/ 17 февраля 2020

В соответствии с Flask Docs вы можете указать, какой метод сопоставить, используя аргумент _method.

flask.url_for(endpoint, **values)

И значения, которые вы можете передать:

  • конечная точка - конечная точка URL (имя функции)
  • значения - переменные аргументы правила URL
  • _external - если установлено значение True, генерируется абсолютный URL. Адрес сервера можно изменить с помощью переменной конфигурации SERVER_NAME, которая возвращается к заголовку хоста, затем к IP-адресу и порту запроса.
  • _scheme - строка, указывающая желаемую схему URL. Параметр _external должен быть установлен в значение True, либо возникла ошибка ValueError. Поведение по умолчанию использует ту же схему, что и текущий запрос, или PREFERRED_URL_SCHEME из конфигурации приложения, если контекст запроса недоступен. Начиная с версии Werkzeug 0.10, для создания URL-адресов, относящихся к протоколу, также можно задать пустую строку.
  • _anchor - при условии, что это добавлено в качестве привязки к URL-адресу.
  • _method - если указано, это явно указывает метод HTTP. <---- Этот </li>

Укажите аргумент _method в url_for следующим образом:

url_for('test', name='xyz', _method='GET')
...