Flask,“在字符串格式化过程中未转换所有参数”

7
尝试为我的应用程序创建注册页面。我正在使用Flask框架和来自pythonanywhere.com的MySQL数据库。
@app.route('/register/', methods=["GET","POST"]) 
def register_page():
try:
    form = RegistrationForm(request.form)



    if request.method == "POST" and form.validate():
        email = form.email.data
        password = sha256_crypt.encrypt((str(form.password.data)))
        c, conn = connection()

        x = c.execute("SELECT * FROM users WHERE email = (%s)",
                      (email))

        if int(x) > 0:
            flash("That email adress is already in use.")
            return render_template('register.html', form=form)

        else:
            c.execute("INSERT INTO users (email, password) VALUES (%s, %s)",
                      (thwart(email),thwart(password)))

            conn.commit()
            flash("Thanks for registering!")
            c.close()
            conn.close()
            gc.collect()

            session['logged_in'] = True
            session['email'] = email

            return redirect(url_for('dashboard'))

    return render_template("sign-up.html", form=form)


except Exception as e:
    return(str(e))}

当我运行时出现错误:字符串格式化期间未转换所有参数。如何修复?也许问题在这个语句中?

c.execute("INSERT INTO users (email, password) VALUES (%s, %s)", (thwart(email),thwart(password)))


1
你能百分之百确定错误发生在那一行吗?我认为问题更可能出现在上面的x = c.execute()行,你应该在最后一个参数中加上(email,)(注意逗号),而不是(email)没有逗号。 - Giles Thomas
我将 (email) 改为 (email,),并得到了相同的结果。 - Vasile
1
成功了!我只是没有重新启动服务器。谢谢! - Vasile
1个回答

8

将我之前的评论转换为答案,因为它似乎是正确的解决方案 :-)

问题来自于另一行。你有以下这段代码:

        x = c.execute("SELECT * FROM users WHERE email = (%s)",
                      (email))

这段代码不是你想象的那样。将email放在方括号中并没有实际作用,因此该行代码等同于将该变量中的每个字符作为一个字符列表传递。如果你改成:

        x = c.execute("SELECT * FROM users WHERE email = (%s)",
                      (email,))

如果您传入一个包含一个项目email的元组,它应该能更好地工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接