【问题标题】:TypeError: search() missing 1 required positional argument: 'name'类型错误:search() 缺少 1 个必需的位置参数:'name'
【发布时间】:2020-07-12 23:41:00
【问题描述】:

我正在尝试将参数从 HTML 代码传递给 python 烧瓶代码,但是当我这样做时出现错误:

TypeError: search() 缺少 1 个必需的位置参数:'name'

这是代码的sn-p:

@app.route("/LoggedOn/search", methods = ["POST"])
def search(name):  # gets a user name as an argument
    books = []
    if request.method != "POST":
        return "please log on and fill on the form"
    option = request.form['field']
    search = request.form['search']
    search = search + '%'   #begins with search, per requirement
    if (option == 'author'):
        books = db.execute("SELECT * FROM books WHERE author LIKE :srch ", {"srch":search}).fetchall()
    elif (option == 'isbn'):
        books = db.execute("SELECT * FROM books WHERE isbn LIKE :srch ", {"srch":search}).fetchall()
    else: # book name cose
        books = db.execute("SELECT * FROM books WHERE title LIKE :srch ", {"srch":search}).fetchall()

     return render_template("search.html", books=books, name = name)

另外,这里是 HTML 部分:

<form action="{{ url_for('search', name  )  }}" method="post">

我没有在其他地方调用函数search。那为什么还抱怨名字不通过呢?

HTML 来自 python 代码,如下所示:

@app.route("/LoggedOn",methods=["GET", "POST"])
def LoggedOn(name):
    return render_template("LoggedOn.html", name=name)

@app.route("/registeration", methods=["GET","POST"])
def registeration():
    if request.method == "POST":
        name = request.form.get("uname")
        password = request.form.get("psw")
        users = db.execute("SELECT * FROM users WHERE name=:name", {"name":name}).fetchall()
        if users != []:
            return render_template("error-register.html")
        user = MyUser(name,password)
        user.add_to_db(db)
        return LoggedOn(name)

所以registeration 函数的名称传递给LoggedOn,然后它传递给loggedon.html,然后通过使用url_for 传递给搜索函数,如上所述。究竟缺少什么?

【问题讨论】:

    标签: python html flask


    【解决方案1】:

    最终我设法通过将每个函数的路由名称调整为函数本身来解决这个问题,方法是在路径中添加文字,例如:

    @app.route("/LoggedOn-<string:name>",methods=["GET", "POST"])
    def LoggedOn(name):
        return render_template("LoggedOn.html", name=name)
    
    @app.route("/LoggedOn/search-<string:name>", methods = ["POST"])
    def search(name): 
    

    现在完全没问题了..

    【讨论】:

      【解决方案2】:

      这是因为您将 LoggedOn 定义为单独的路由。如果您只想将其用作函数,请不要在顶部使用 app.route 装饰器。

      如果您也打算将其作为路由,则需要确保参数列表与 url 路径中的某些内容匹配。

      【讨论】:

      • 这是因为它是从 search.html 文件中调用的:
      • 表格>
      • 我删除了路由线,仍然出现同样的错误
      • 现在我遇到了另一个问题,在我尝试删除 name 作为搜索函数的参数后,为了查看我得到了什么错误,我在
      • 说:TypeError: url_for() 接受 1 个位置参数,但给出了 2 个
      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 2018-09-12
      • 2021-08-05
      • 2021-07-06
      • 2021-08-05
      • 2017-07-23
      • 2020-12-11
      相关资源
      最近更新 更多