Try to create a register page for my app. I am using Flask framework and MySQL db from pythonanywhere.com.
@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))}
On running I get the Error:not all arguments converted during string formatting. How to fix it? May be the problem in this statement?
c.execute("INSERT INTO users (email, password) VALUES (%s, %s)",
(thwart(email),thwart(password)))
Just converting my earlier comment to an answer, as it seemed to be the right solution :-)
The problem is coming from a different line. You have this:
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email))
This doesn't do what you might think it does. Putting email
in brackets does nothing, so the line is actually equivalent to passing in each character of whatever's in that variable in a list of characters. If instead you do this:
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email,))
...then you'll be passing in a tuple containing one item, email
, and it should work better.
来源:https://stackoverflow.com/questions/33396856/flask-not-all-arguments-converted-during-string-formatting