【问题标题】:URL Builder TypeError error() takes exactly 1 argument (0 given)URL Builder TypeError error() 正好采用 1 个参数(给定 0)
【发布时间】:2019-10-06 11:29:42
【问题描述】:

抱歉,如果这是重复的,我一直在努力理解这是如何导致错误的,因为它看起来与所有其他正确的相同。

我想用烧瓶将变量传递给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):

第一行告诉我变量定义正确。感谢您的帮助。

【问题讨论】:

  • url_for() 接受函数名作为第一个参数,以及一个或多个关键字参数,每个参数对应于 URL 的可变部分

标签: python python-2.7 flask


【解决方案1】:
@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

【讨论】:

  • 这是我得到的最好的描述。我对此很陌生,仍然有点困惑。因此,如果我理解正确,如果我想让它工作,那么我将不得不构建一个解码器来处理 error_msg 参数。现在我对什么是查询参数以及为什么它不会作为函数参数传递有点困惑?我也不确定 query parametersfunction arguments 之间的区别是什么?如果您能解释或指出一些文档,将不胜感激。
【解决方案2】:

根据烧瓶文档,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'))

网址:

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

更多细节

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多