Ошибка типа: search () отсутствует 1 обязательный позиционный аргумент: 'name' - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь передать аргумент из HTML кода в python flask код, но когда я это получаю, я получаю ошибку:

TypeError: search () отсутствует 1 требуемый позиционный Аргумент: 'name'

Вот фрагмент кода:

@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, как указано выше. Чего точно не хватает?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

в конце концов мне удалось это исправить, адаптировав название маршрута каждой функции к самой функции, добавив литерал к пути, например:

@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): 

теперь проблем нет вообще ..

0 голосов
/ 01 апреля 2020

Это потому, что вы определяете LoggedOn как отдельный маршрут. Если вы просто хотите использовать его как функцию, не используйте декоратор app.route сверху.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...