我在我的烧瓶webapp上有这个注册表格,它检查用户名是否已经注册。出于某种原因,当我注册时,它会将我重定向到我的home.html(这意味着我已登录),并且还给了我一个flash("Error. Username already exists")
。为什么会进入except:
然后进入finally
?我不太清楚如何解决这个问题。我也检查了我的数据库。我的用户信息保存在那里。
这是我的代码:
if request.method == "POST":
with sql.connect(DATABASE) as con:
cur = con.cursor()
try:
# flash("register attempted")
username = request.form['username']
password = pwd_context.encrypt((str(request.form['password'])))
email = request.form['email']
cur.execute("INSERT INTO users (name,password,email) VALUES (?,?,?)",(username,password,email) )
con.commit()
flash ("Successfully registrated")
except:
con.rollback()
flash("Error. Username already exists")
return redirect(url_for("register"))
finally:
session['logged_in'] = True
session['username'] = username
gc.collect()
return render_template("home.html")
con.close()
修改
x = cur.execute("SELECT * FROM users WHERE username = ?"),(username)
if int(len(x)) > 0:
flash("Error. Username already exists")
return redirect(url_for("register"))
else:
cur.execute("INSERT INTO users (name,password,email) VALUES (?,?,?)", (username, password, email))
con.commit()
flash("Successfully registrated")
session['logged_in'] = True
session['username'] = username
gc.collect()
msg = Message('Hello', sender='yourId@gmail.com', recipients=[email])
msg.body = "your username for ak047 is: %s and your password is %s" % (request.form['username'],request.form['passwordd'])
mail.send(msg)
return render_template("home.html", msg=msg)
con.close()
答案 0 :(得分:2)
您没有捕获任何特定异常。如果您的try
块中的代码抛出任何异常,例如request.form['email']
为null并且您尝试将其插入非空列,则会抛出异常这会导致except
块中的代码运行。即使IndexError
也会导致它运行。因此,任何错误都会导致执行flash("Error. Username already exists")
行。
finally
块中的代码将始终运行。
查看error handling in Python.特别是关于捕获特定错误。做对是非常有用的事情。
如果您想确切知道抛出的异常,可以执行以下操作:
try:
....
except Exception as e:
print(e)
....
这会捕获任何异常并将异常存储在变量e
中,因此可以打印出来或记录到stdout。
一旦您知道您的代码是,例如,抛出IndexError
或NotNull
错误,或者它可能出现的任何错误,您可以编写特定于错误的代码以启动,具体取决于错误,例如:
try:
....
except IndexError:
# Do some code if there is an IndexError in the try block
except NotNull:
# Do some code if your db throws a not null error when trying to insert something in the try block
finally:
# Always run the code in here...