2016-10-25 7 views
0

pythonでcx_Oracleモジュールを使用してOracleデータベースに接続して照会します。cx_Oracle接続メソッドで失敗した場合にユーザーにパスワードを再試行するように促す

import cx_Oracle 

ユーザーは、順番に、connectメソッドのユーザー/パスワードの部分に渡されますユーザー名とパスワードの入力を要求することができますので、私はTkinterのウィジェットを構築しています:

username = 'user' 
password = 'password' 
db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(username, password)) 

これは、ユーザーが最初の試行で正しいユーザー名とパスワードを入力したときにうまく動作しますが、そうでない場合は、ユーザー名やパスワードを繰り返し試すロジックが必要です。

間違った資格情報が入力された場合にスローされるエラーは、このです:私は今しばらくinterweb周り掘ってきたと私は本当にのために働く何かを見つけることができないよう

cx_Oracle.DatabaseError: ORA-01017: invalid username/password; logon denied

私。私が遭遇したことの多くは、ユーザー名とパスワードを知られている辞書やその行に沿ったものと照らし合わせてチェックすることを含むようです。私はそれをする贅沢を持っていません。私はおそらく、これをとにかく思っているところにいるので、投稿したいと思っています。私はそれがちょうど私が必要とする簡単な 'while'ループのようなものだと思う。ような何か:ここ

while connection_throws_error_: 
    keep_trying_to_log_in 

は私の一般的なコードされています。下記のアレックスへ

import Tkinter 
from Tkinter import * 
import cx_Oracle, pprint 

master = Tk() 
Label(master, text="Username").grid(row=0) 
Label(master, text="Password").grid(row=1) 

e1 = Entry(master) 
e2 = Entry(master, fg = 'red', show="*") 

e1.grid(row=0, column=1) 
e2.grid(row=1, column=1) 

Button(master, text='Login', command=master.quit).grid(row=3, column=1, sticky=W, pady=4) 

master.title("MEMPRD Login") 
master.mainloop() 

# This is where I need to iteratively prompt user to enter crentials if they are incorrect. 
db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(e1.get(), e2.get()) 

UPDATE

おかげで、私は彼のコードを使用しました、私のためにいくつかのカスタマイズを作っ自分自身の使用とそれが動作します。ここでは作業コードだ:

master = Tk() 
Label(master, text="Username").grid(row=0) 
Label(master, text="Password").grid(row=1) 

e1 = Entry(master) 
e2 = Entry(master, fg = 'red', show="*") 

e1.grid(row=0, column=1) 
e2.grid(row=1, column=1) 

Button(master, text='Login', command=master.quit).grid(row=3, column=1, sticky=W, pady=4) 
#Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4) 



master.title("Login") 
master.mainloop() 

#show_entry_fields() 



print e1.get() 
print e2.get() 

while True: 
    try: 
     db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(e1.get(), e2.get()) 
    except cx_Oracle.DatabaseError as e: 
     error, = e.args 
     if error.code == 1017: 
      print('Please check your credentials.') 
      e2.delete(0, 'end') 
      master.mainloop()   
     else:   
      raise 
    else: 
     print 'success!' 
     break 

答えて

1

これは、単純なコンソールアプリケーションでどのように見えるかです:

while True: 
    username = input('Username:') 
    password = getpass('Password:') 
    try: 
     db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(username, password)) 
    except cx_Oracle.DatabaseError as e: 
     # I'm guessing here, you will have to inspect the exception to decide 
     # how to check what kind of error it is 
     if 'username/password invalid' in e.message.lower(): 
      print('Invalid login') 
     else: 
      raise 
    else: 
     print('Success!') 
     break 

私はTkinterのはそうあなたはおそらくそのためにそれを再構築する必要がありますどのように動作するか分かりません、要点はループでtry/exceptを使用することです。

+0

ありがとうございました。これは、私が想像していたものにもっと似ています。 whileループにtryやexcept文を組み込む必要があると感じました。私はこれが私のためにどのように機能したかを報告しますが、このログインテストの結果、私は自分のoracleアカウントから自分自身をロックしてしまったようです。 – Mike

関連する問題