我使用python中的cx_Oracle模块来连接和查询oracle数据库。
import cx_Oracle
我已经构建了一个tkinter小部件,因此可以提示用户输入用户名和密码,然后这些用户名和密码将被传递到connect方法的用户/密码部分:
username = 'user'
password = 'password'
db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(username, password))
当用户在第一次尝试时输入正确的用户名和密码时,一切正常,但是当他们不这样做时,我需要一些逻辑来迭代地重新尝试他们的用户名和/或密码。
输入错误凭据时引发的错误是:
cx_Oracle.DatabaseError:ORA-01017:用户名/密码无效;登录 拒绝
我一直在挖掘互联网一段时间,我似乎找不到适合我的东西。看起来我遇到的很多事情都涉及检查已知字典的用户名和密码或类似的东西。我没有这样做的奢侈。我可能正处于这样的地方,无论如何我都在想这个,所以我想发布一下。我觉得这只是我需要的某种简单的'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())
更新
感谢下面的Alex,我已经使用了他的代码,为自己的使用做了一些自定义,并且它有效。这是工作代码:
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
答案 0 :(得分: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。