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