Flask Python Registration无法正常工作

时间:2016-10-25 10:21:46

标签: python sqlite flask

我在我的烧瓶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()

1 个答案:

答案 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。

一旦您知道您的代码是,例如,抛出IndexErrorNotNull错误,或者它可能出现的任何错误,您可以编写特定于错误的代码以启动,具体取决于错误,例如:

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...