我使用python中的cx_Oracle模块来连接和查询oracle数据库。
import cx_Oracle
我构建了一个 tkinter 小部件,以便可以提示用户输入用户名和密码,而这些用户名和密码又将传递到连接方法的用户/密码部分:
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
这就是简单控制台应用程序中的样子:
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 。