URL Builder TypeError error () принимает ровно 1 аргумент (задано 0) - PullRequest
0 голосов
/ 20 мая 2019

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

Я хочу передать переменную в url_for с помощью колбы, но я продолжаю получать TypeError

@app.route('/membership/register/', methods=["GET", "POST"])
def register():
    if request.method == "GET":
        return render_template("NewForm.html", error=False)
    elif request.method == "POST":
      checker = datetime.utcnow()
      if (checker.minute % 2) == 0:
        error = False
        error_type = "username"
      else:
        error = False
        error_type = "terms"
      if error == False:
        message = 'success'
      elif error == True:
        message = 'error'
      else:
        message = 'arbitrageerror'
      print error_type, message
      return redirect(url_for(message , error_msg = error_type ))
    else:
        return redirect(url_for('arbitrageerror'))


@app.route('/register/success', methods=["GET"])
def success():
  if request.method == "GET":
    return render_template("register_sucess.html", error=True)

@app.route('/register/arbitrageerror', methods=["GET"])
def error404():
  if request.method == "GET":
    return render_template("error404.html")

@app.route('/register/error', methods=["GET"], error_msg = error_type)
def error(error_msg):
    if error_msg == "username":
        if request.method == "GET":
            return render_template("register_error.html")
    if error_msg == "terms":
        return "NO Terms"

Я получаю следующую ошибку:

TypeError
TypeError: error() takes exactly 1 argument (0 given)

Когда я запускаю его, я печатаю обе переменные, но потом не могу получить url_for с добавленной переменной, чтобы получить переменную. Я не уверен, правильно ли я передаю это обработчику. redirect(url_for((message, error_msg=error_type)) - это строка, с которой мне нужна помощь, а затем фактическая функция для def error(error_msg)

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

Terms error
127.0.0.1 - - [18/May/2019 23:37:52] "POST /register/ HTTP/1.1" 302 -
127.0.0.1 - - [18/May/2019 23:37:52] "GET /register/error?error_msg=Terms HTTP/1.1" 500 -
Traceback (most recent call last):

Первая строка говорит мне, что у меня правильно определены переменные. Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 20 мая 2019
@app.route('/register/error', methods=["GET"])
def error():
    error_msg = request.args.get('error_msg')
    if error_msg == "username":
        if request.method == "GET":
            return render_template("register_error.html")
    if error_msg == "terms":
        return "NO Terms"

Причина:

error_msg - это параметр запроса, который не будет передан в качестве аргумента функции в функцию error().

Вы должны получить запроспараметр из объекта request.

Если вы хотите, чтобы параметры запроса передавались в качестве аргументов функции, выполните следующий ответ: https://stackoverflow.com/a/34597794/2644759

0 голосов
/ 20 мая 2019

В соответствии с документом фляги, url_for принимает имя функции в качестве первого аргумента и любое количество аргументов ключевого слова, каждый из которых соответствует переменной части правила URL. Неизвестные переменные части добавляются к URL в качестве параметров запроса.

Например.

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return '{}\'s profile'.format(username)

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))

URL:

/
/login
/login?next=/
/user/John%20Doe

Подробнее

http://flask.pocoo.org/docs/1.0/quickstart/#url-building

...