提示用户在cx_Oracle连接方法失败时重试密码

问题描述:

我可以使用python中的cx_Oracle模块来连接和查询oracle数据库。提示用户在cx_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: invalid username/password; logon denied

我一直在周围挖了interweb了一段时间,我没有真正似乎能找到的东西,对于作品我。看起来我遇到的很多事情都涉及到检查用户名和密码是否与已知的字典或其他类似的内容相关。我没有这样做的奢侈。无论如何,我可能正处于思考这个问题的地步,所以我想发布。我觉得这只是我需要的一种简单的'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 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 /在循环中除外。

+0

谢谢亚历克斯。这看起来更像我所设想的。我有一种感觉,我不得不在while循环中加入一些try和except语句。我会报告这是如何为我工作的,但是似乎毕竟这个登录测试,我已经把自己锁定在我的oracle帐户之外! – Mike