【问题标题】:Prompt user to retry password when unsuccessful in cx_Oracle connect methodcx_Oracle 连接方法失败时提示用户重试密码
【发布时间】:2016-10-25 22:04:57
【问题描述】:

我使用 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())

更新

感谢下面的亚历克斯,我使用了他的代码,进行了一些自定义以供我自己使用,并且可以正常工作。这是工作代码:

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

【问题讨论】:

    标签: python login passwords connect cx-oracle


    【解决方案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。

    【讨论】:

    • 谢谢亚历克斯。这看起来更像我的设想。我有一种感觉,我也必须在 while 循环中加入一些 try 和 except 语句。我将报告这对我的工作方式,但似乎在所有这些登录测试之后,我已经将自己锁定在我的 oracle 帐户之外!
    猜你喜欢
    • 2018-02-14
    • 2012-10-10
    • 2019-11-16
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    相关资源
    最近更新 更多