2016-10-25 14 views
-1

私のフラスコwebappにこの登録フォームがあります。これはユーザー名が既に登録されているかどうかをチェックします。何らかの理由で私が登録すると、home.html(私はログインしたことを意味します)にリダイレクトされ、私にはflash("Error. Username already exists")が返されます。なぜそれがexcept:に入り、次にfinallyに入りますか?私はそれをどのように修正するかについてはあまりよく分かりません。私は自分のデータベースもチェックしました。私のユーザー情報はそこに保存されます。フラスコのPythonの登録が正しく機能しない

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() 

EDIT:

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='[email protected]', 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() 

答えて

2

あなたがキャッチされていませんいかなる特定の例外

は私のコードを厥。 tryブロック内のコードが例外(たとえば、request.form['email'])がnullで、null以外の列に挿入しようとすると、exceptブロックのコードが実行される例外がスローされます。 IndexErrorでも、これが実行されます。したがって、エラーが発生すると、flash("Error. Username already exists")行が実行されます。

ブロックfinallyのコードは常に実行されます。

error handling in Python.をご覧ください。特に特定のエラーを捕捉する場合。正しいことを得ることは非常に便利です。

あなたは例外がスローされている内容を正確に把握したい場合は、あなたが何か行うことができます:

try: 
    .... 
except Exception as e: 
    print(e) 
    .... 

をこれは、任意の例外をキャッチし、変数e内の例外とthuslyスタックトレースを格納し、なるように準備ができて印刷されるか、または標準出力に記録されます。

あなたはあなたのコードがあることを知っていたら、例えば、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... 
+0

私のコードでは、 'con.rollback()'はSQLクエリをキャンセルしません。 – Julian

+0

私の投稿を編集しました。新しいコードは適切に動作しますか? – Julian

+0

難しいことを教えてください。元のコードがうまく処理できなかったというエラーが発生しました。私が答えて言ったように、それはSQLインサートに入っている可能性があります。私はまだ 'Exception'をキャッチしてスタックトレースを記録すべきだと思います。 try-catchモデルは、あなたがやっていることに適しています。 –

関連する問題