繁体   English   中英

Python中的简单登录功能

[英]Simple login function in Python

def login():    
    user = raw_input("Username: ")
    passw = raw_input("Password: ")
    f = open("users.txt", "r")
    for line in f.readlines():
        us, pw = line.strip().split("|")
        if (user in us) and (passw in pw):
            print "Login successful!"
            return True
    print "Wrong username/password"
    return False

def menu():
    #here's a menu that the user can access if he logged in.

def main():
    login()
    log = login()
    if log == True:
         menu()

而 users.txt 是:

john22|1234
max2|2211
jack6|1551

问题是,当我运行程序并输入正确的用户名和密码时,它打印出“登录成功!” 但它不会继续菜单()。 相反,它再次显示“用户名:”和“密码:”。 但是,当我再次输入正确的用户名和密码(与 users.txt 相同或不同的对)时,它进入 menu() 并且一切正常。 所以我的猜测是,出于某种原因,您必须两次输入正确的信息,而我不希望那样。 我到处搜索,但我不明白为什么会发生这种情况......

您调用了login()函数两次。 只有第二个使用返回值,因此您可以删除第一个调用

def main():
    login()         # <--- Remove this one
    log = login()

您可能希望考虑使用的是getpass 在密码字段上使用它而不是raw_input将防止密码显示在屏幕上。

import getpass

...

def login():
    ...
    passw = getpass.getpass("Password: ")

其余代码的行为相同,但在控制台上,输出如下所示:

Username: max2
Password:
Login successful!

请注意,尽管输入了有效的密码,但“密码:”行是空的

这里的问题是你在调用login()两次 whitin main 要修复您的错误,只需删除第一个调用,因为甚至没有使用返回值。 另外,我不确定它是否是有意的,但是:

if (user in us) and (passw in pw):

将匹配 ('user', 'pass') 即使 (us, pw) 是 ('username', 'password')。 请改用==运算符。

最不重要的一件事,你应该考虑改变:

us, pw = line.strip().split("|")

到:

us, pw = line.strip().split("|", 1)

只将行拆分一次,否则密码将无法包含|

问题是有两个 login() 实例被调用。 以下代码将重复登录,直到正确为止:

def login():    
    user = raw_input("Username: ")
    passw = raw_input("Password: ")
    f = open("users.txt", "r")
    for line in f.readlines():
        us, pw = line.strip().split("|")
        if (user in us) and (passw in pw):
            print "Login successful!"
            return True
    print "Wrong username/password"
    return False

def menu():
    #here's a menu that the user can access if he logged in.

def main():
    global True
    while True:
        True = True
        log = login()
        if log == True:
             menu()
             True = False


main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM