> 백엔드 개발 > 파이썬 튜토리얼 > 로그인 창 작성을 위한 구체적인 단계에 대한 자세한 설명

로그인 창 작성을 위한 구체적인 단계에 대한 자세한 설명

PHP中文网
풀어 주다: 2017-06-20 13:47:46
원래의
1603명이 탐색했습니다.

아이디어:

1. 이 과제에서는 Linux 로그인 인증 프로세스를 참조하고 온라인 뱅킹, Alipay 및 기타 잠금 규칙을 결합했습니다.

1) 인증 프로세스는 Linux 로그인을 나타냅니다. 사용자 입력을 마치면 비밀번호를 입력한 후 사용자 이름이 존재하는지, 사용자가 잠겨 있는지 확인한 후 비밀번호가 맞는지 확인하세요. 사용자 이름이나 비밀번호가 틀렸는지 알려주므로 무차별 대입 크래킹 가능성이 높아집니다. 난이도

2) 잘못된 입력 횟수 계산 및 잠금 에 대해서는 은행 및 Alipay의 관행을 참고합니다. , 즉 그들은 잘못 입력한 횟수 에만 관심이 있으며 올바른 항목을 몇 번 입력했는지가 아닙니다. 즉, 두 번 잘못 입력하고 세 번째 잘못 입력했으며 이전 개수는 다음과 같습니다. 삭제되지 않았습니다 즉, 오늘 1,000번 입력하고 997번 잘못 입력했지만 3번만 잘못 입력했기 때문에 죄송합니다. 그래도 잠가야 합니다. 그리고 세 개의 잘못된 항목이 연속될 필요는 없습니다. 3번 잘못 입력하면 잠깁니다.

2. 카운트 및 상태 저장과 관련하여 파일을 통해 유지하는 것을 고려합니다. 잘못된 입력 수의 누적 및 잠금은 파일에 저장됩니다. 프로그램의 신뢰성이 보장되므로 프로그램이 종료되어도 카운트는 여전히 유효합니다. 파일 형식은 다음과 같습니다.

alex sb lock 3
Tom 666 Unlock 0
geng 888 Unlock 2

첫 번째 열은 사용자 이름, 두 번째 열은 비밀번호, 세 번째 열은 사용자 상태(lock은 lock을 나타내고, Unlock은 잠금 없음을 의미함), 네 번째 열은 로그인 수입니다(실제로 오류가 있는 경우 로그인 수는 1씩만 증가하면 되며, 오류가 있는 경우 무시됩니다. 오류 없음).

코드는 다음과 같습니다.

           with open(filename,)           key,values                           lines =                print(             f.write( .join(lines) +                           values.insert(             f.write( .join(values) +   # messages = {:[,,],:[,,],:[,, # write_file(messages,   __name__ ==      active =               username = input(         users_dict = {}     #用户字典,用于存放用户的信息,键-用户名,值-         with open(,)              lines =              line                  user_list =                 users_dict[user_list[]] = user_list[           username               users_dict[username][] ==                  print(                                (users_dict[username][]) <                      user_pwd = input(                      users_dict[username][] ==                         print(                                               (users_dict[username][]) !=                              print( % ( - (users_dict[username][                         users_dict[username][] = (users_dict[username][]) +                                        print(                     users_dict[username][] =                      users_dict[username][] =                      write_file(users_dict,         elif username ==                         print()
运行结果如下:
请输入你的用户名(输入quit退出):tom
请输入密码:22
还有2次机会,用户将被锁定!
请输入密码:22
还有1次机会,用户将被锁定!
请输入密码:22
对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!
请输入你的用户名(输入quit退出):alex
您输入的用户名已经锁定,请联系管理员!
로그인 후 복사

실제로 파일의 작업은 본질적으로 문자열 목록, 사전, 파일 작업, 파일을 읽는 방법, readlines( ) 작업입니다. 한 줄씩 읽어서 목록으로 저장하고, dict(사전)은 사용자 정보를 기록하는 데 사용됩니다. 스트링 스플라이싱(join) 방식(" ".join(list))은 문자열과 리스트를 스플라이싱하여 새로운 문자열을 형성한다. 실제로 파이썬에 저장되는 문자열의 본질은 리스트(Storage), 스플라이싱(Splicing) 형태이다. 목록 사이, list.extend(list), 목록 사이 접합.

코드 설명:

1. 여기서는 오늘 강좌에서 다루지 않은 두 가지 내용인 사전과 함수를 사용합니다. 사용자 정보를 사전에 저장하는 목적은 사용자 이름이 존재하는지 확인하는 것입니다. 는 사전의 키로 직접 사용되며, 그 외의 정보는 사전의 값으로 사용되어 해당 키에 일대일로 대응합니다. 이렇게 사용자명 존재 여부를 판단할 때는 in만 사용하면 됩니다.

2. 코드의 61행과 62행은 파일을 사전으로 변환하는 프로세스를 완료합니다.

원본 Zhang Xiaoyu 코드 예:

#!/usr/bin/env python3
# coding:utf-8'''Created on: 2015年12月29日

@author: 张晓宇

Email: 61411916@qq.com

Version: 1.0Description: 输入用户名密码,认证成功显示欢迎信息,认证失败,输错三次后锁定

Help:'''import os
# 定义用户信息写入函数,用于把用户信息写回文件
def write_to_account_file(accounts,account_file_path):"""accounts是一个用户信息字典,目的是把变更过的信息写入文件中"""account_file = open(account_file_path,"w")for key,val in accounts.items():
        line = []
        line.append(key)
        line.extend(val)
        print(" ".join(line))      #字符串与列表拼接,目的是实现列表中每个元素加空格生成一个字符串如a b c d格式
        account_file.write(" ".join(line) + "\n")    #往文件中添加信息
    account_file.close()   #直接打开文件的时候一定要记得关闭文件,以免文件休息丢失if __name__ == '__main__':'''    @parameters:
        account_file_path:账户文件
        password_col_num:账户文件中密码所在的列(从0开始)
        status_col_num:账户文件中账户状态所在的列(从0开始)
        error_count_num:账户文件中输入错误次数所在的列(从0开始)
        app_info:系统信息,用户启动应用后的输出
        welcome_msg:用户成功登录后的信息'''    account_file_path = 'account.db'password_col_num = 1status_col_num = 2error_count_num = 3app_info = '''    +---------------------------------+
    | Welcome to gcx system           |
    | Version:2.0                     |
    | Author:zhuzhu                   |
    +---------------------------------+'''    welcome_msg = "Welcome %s,authentication is successful!"if os.path.exists(account_file_path):    #os.path.exists()判断文件是否存在,返回布尔值
    # 判断账户文件是否存在
        account_file = open(account_file_path,"r")else:
        #文件不存在,看系统是否有误
        print("Error:Account file 'account.db' is not exit,please check!")
        exit(1)

    #读账户文件
    accounts = {}for line in account_file.readlines():   #按行读取文件
        account = line.strip().split()      #清楚空格后进行分列,生成一个列表
        accounts[account[0]] = account[1:]"""把列表中的第一个元素(用户名)当做键,用户的其他信息当做值,组成键值对存放在字典中""""""account[0]键,account[1:]是值"""account_file.close()    #关闭文件
    flag = Truewhile flag:
        print(app_info)
        #输入用户名
        username = input("Username(Enter quit to exit): ").strip()
        #判断用户是否输入的为quitif username == "quit":
            #是则退出循环,程序结束breakpassword = input("Password: ").strip()
        #判断用户名是否存在if username not in accounts.keys():
            #不存在提示错误信息并退出当前循环让用户重新输入
            print("Error:Username or Password it is error!")continue     #结束本次循环,让用户再次输入用户名和密码,继续执行下一次循环if accounts[username][status_col_num - 1] == "lock":
            #如果被锁定退出当前循环让用户重新输入
            print("Error:Account is locked.Please contact the administrator!")continue    #跳过本次循环,让用户重新输入进行验证,这个可以避免很多缩进,能够继续执行下一次
        #判断用户密码是否正确if password == accounts[username][password_col_num - 1]:
            #正确显示欢迎信息
            print(welcome_msg %username)breakelse:
            #用户密码不正确的情况
            #提示用户名或密码错误
            print("Error:Username or Password it is error!")
            #输入错误次数加1
            accounts[username][error_count_num - 1] = str(int(accounts[username][error_count_num - 1]) + 1)
            #判断是否已经达3次if int(accounts[username][error_count_num - 1 ]) == 3:
                #如果输入错误达到3次
                #提示账户将被锁定
                print("Error: This account will be locked,Please contact the administrator!System will be exit!")
                #将用户状态改为lock并写入文件
                accounts[username][status_col_num - 1] == "lock"write_to_account_file(accounts,account_file_path)breakwrite_to_account_file(accounts,account_file_path)
로그인 후 복사

위 코드의 하이라이트:

(1) 계속: 이 루프를 종료하면 사용자가 다시 입력할 수 있도록 하는 목적을 달성하기 위해 계속 이후의 코드가 실행되지 않습니다. 사용자가 등록을 선택하거나 웹페이지를 닫을 때까지

(2) 문서는 비교적 잘 표준화되어 있으며 설명이 있습니다.

(3) 파일을 한 줄씩 읽은 다음 파일에 씁니다. 한 줄씩 수정하는 동안 목록과 사전에 대한 지식을 사용하세요.

(4) " ".join(list) 문자열과 목록을 연결하여 새 문자열을 생성합니다.

(5) 문자열 분할; 확장() 목록 간 연결.

위 내용은 로그인 창 작성을 위한 구체적인 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿