Колба: использование & ldquo; add_url_rule & rdquo; с аргументом по умолчанию для двух GET url для той же конечной точки [duplicate]

32
задан Paulo Scardine 23 June 2013 в 01:37
поделиться

7 ответов

Названия ваших представлений должны быть уникальными, даже если они указывают на один и тот же метод просмотра.

app.add_url_rule('/',
                 view_func=Main.as_view('main'),
                 methods = ['GET'])

app.add_url_rule('/<page>/',
                 view_func=Main.as_view('page'),
                 methods = ['GET'])
34
ответ дан Michael Davis 19 August 2018 в 04:01
поделиться

Для пользователей, которые используют @ app.route, лучше использовать ключевой аргумент endpoint, а не указывать значение __name__, как указано Roei Bahumi . В качестве примера возьмем:

@app.route("/path1", endpoint='func1')
@exception_handler
def func1():
    pass

@app.route("/path2", endpoint='func2')
@exception_handler
def func2():
    pass
7
ответ дан Community 19 August 2018 в 04:01
поделиться

Флажок требует, чтобы вы связали одну «функцию просмотра» с «конечной точкой». Вы дважды вызываете Main.as_view('main'), что создает две разные функции (точно такую ​​же функциональность, но различную по сигнатуре памяти). Расскажите, вы должны просто сделать

main_view_func = Main.as_view('main')

app.add_url_rule('/',
             view_func=main_view_func,
             methods=["GET"])

app.add_url_rule('/<page>/',
             view_func=main_view_func,
             methods=["GET"])
4
ответ дан dtheodor 19 August 2018 в 04:01
поделиться

Существует исправление для проблемы с фляксом № 570, появившееся в последнее время (фляга 0.10), которая вызывает это исключение.

См. https://github.com/mitsuhiko/flask/issues / 796

Итак, если вы перейдете в flask / app.py и закомментируете 4 строки 948..951, это может помочь, пока проблема не будет полностью решена в новой версии.

Разница этого изменения находится здесь: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1

1
ответ дан plaes 19 August 2018 в 04:01
поделиться
  • 1
    Re: «пока проблема не будет полностью решена в новой версии»: «Нет» «проблема», для решения. Как показало обсуждение проблемы, повышение исключения в случае кода в вопросе является ожидаемым результатом. Как объяснено в принятом ответе, конечные точки находятся в конфликте. Это ошибка в коде пользователя Flask, а не в самой фляге. – Mark Hildreth 30 January 2014 в 17:43

Эта же проблема возникает со мной, но с другим использованием. Когда я попытался обернуть функцию API с помощью 2 декораторов:

  1. @ app.route ()
  2. Мой костюм @exception_handler decorator

У меня есть такое же исключение, потому что я пытался обернуть несколько функций этими двумя декораторами:

@app.route("/path1")
@exception_handler
def func1():
    pass

@app.route("/path2")
@exception_handler
def func2():
    pass

В частности, это вызвано попыткой зарегистрировать несколько функций с помощью обертки имени:

def exception_handler(func):
  def wrapper(*args, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        error_code = getattr(e, "code", 500)
        logger.exception("Service exception: %s", e)
        r = dict_to_json({"message": e.message, "matches": e.message, "error_code": error_code})
        return Response(r, status=error_code, mimetype='application/json')
  return wrapper

Изменение имени функции, которая была решена для меня (wrapper.func_name = func.func_name):

def exception_handler(func):
  def wrapper(*args, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        error_code = getattr(e, "code", 500)
        logger.exception("Service exception: %s", e)
        r = dict_to_json({"message": e.message, "matches": e.message, "error_code": error_code})
        return Response(r, status=error_code, mimetype='application/json')
  # Renaming the function name:
  wrapper.func_name = func.func_name
  return wrapper

Затем было выполнено декорирование более чем одной конечной точки.

30
ответ дан Roei Bahumi 19 August 2018 в 04:01
поделиться
  • 1
    Вы также можете использовать functools.wraps для достижения функции переименования. – ryannjohnson 2 April 2017 в 22:46
  • 2
    Мне пришлось использовать wrapper.__name__ вместо wrapper.func_name. Возможно, это разница между python2 и python3? – Resonance 30 January 2018 в 12:36
  • 3
    Это была проблема в моем фляге restful API с использованием декораторов. wrapper.__name__ = func.__name__ перед вызовом обертки решила проблему. – Tom Wojcik 5 April 2018 в 09:46

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

Эта проблема связана с флягой 0.10, если у вас есть такая же версия, а затем выполните следующие действия, чтобы избавиться от этого:

sudo pip uninstall flask
sudo pip install flask=0.9
1
ответ дан shrishinde 19 August 2018 в 04:01
поделиться

Я хотел бы добавить к этому более «типовое» решение.

def func_name(f):
    def wrap(*args, **kwargs):
        if condition:
            pass
        else:
            whatever you want
        return f(*args, **kwargs)
    wrap.__name__ = f.__name__
    return wrap
0
ответ дан TheyDontHaveIT 19 August 2018 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: