python模拟一个简单的用户登录

前景

今天学到了一个模块hashlib,通过廖老师的文章,我猛然发现!原来存储在数据库里面的用户名的密码是经过hash算法之后的,而不是明文!真的是学到了!然后转念一想,计从心来,自己模拟了一个登录

思路

  • 用一个字典充当数据库
  • 四个方法,分别实现
    • 注册
    • 验证码
    • 登录(验证输入的信息)
    • 将新用户的信息储存进字典里面,密码用md5算后,再存储

主要功能

  • 注册
    • 对密码进行检验,必须由大,小写字母、数字、特殊字符构成
    • 检验用户名是否已存在
    • 输入验证码
  • 验证
    • 对用户名检验,必须为已存的用户
    • 验证码检验
    • 密码检验

代码

import hashlib
from PIL import Image, ImageFont, ImageDraw, ImageFilter
import random


def image():
    str1 = ''
    total = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789'
    # 图片大小130 x 50
    width = 130
    height = 50
    # 先生成一个新图片对象
    im = Image.new('RGB', (width, height), 'white')
    # 设置字体
    font = ImageFont.truetype('FreeSans', 40)
    # 创建draw对象
    draw = ImageDraw.Draw(im)

    # 输出每一个文字
    for item in range(5):
        temp = random.choice(total)
        draw.text((5 + random.randint(4, 7) + 20 * item, 5 + random.randint(3, 7)), text=temp,
                  fill='black', font=font)
        str1 += temp

    # 划几根干扰线
    for num in range(8):
        x1 = random.randint(0, width / 2)
        y1 = random.randint(0, height / 2)
        x2 = random.randint(0, width)
        y2 = random.randint(height / 2, height)
        draw.line(((x1, y1), (x2, y2)), fill='black', width=1)

    # 模糊下,加个帅帅的滤镜~
    im = im.filter(ImageFilter.FIND_EDGES)
    im.show()

    return str1


def store(user, secret, db):
    md5 = hashlib.md5()
    md5.update(secret.encode('utf-8'))
    result = md5.hexdigest()
    db[user] = result


def verify(db):
    while True:
        result1 = image()
        username = input('输入你的用户名\n')
        secret = input('输入你的密码:\n')
        code = input('输入你的验证码:\n')
        md5 = hashlib.md5()
        md5.update(secret.encode('utf-8'))
        result = md5.hexdigest()
        if username not in db:
            print('用户名不存在')
        elif result1 != code:
            print('验证码输入错误')
        elif db[username] == result:
            print('验证通过,欢迎光临')
            break
        else:
            print('密码不正确,请重新输入')


def register(db):
    while True:
        username = input('输入你的用户名\n')
        if username in db.keys():
            print('用户名已存在,请重新输入')
            continue
        result = image()
        secret = input('输入你的密码:\n')
        code = input('输入你的验证码:\n')
        dicta = {'number': 0, 'lower': 0, 'upper': 0, 'other': 0}
        for item in secret:
            if item.isdigit():
                dicta['number'] += 1
            elif item.islower():
                dicta['lower'] += 1
            elif item.isupper():
                dicta['upper'] += 1
            else:
                dicta['other'] += 1
        if dicta['lower'] < 1 or dicta['upper'] < 1 or dicta['number'] < 1 or dicta['other'] < 1:
            print('密码必须有大、小写字母,数字,和特殊字符四部分组成,请重新输入')
        elif code != result:
            print('验证码输入错误')
        else:
            print('验证通过,欢迎光临')
            break
    return username, secret


if __name__ == '__main__':
    database = {'肖鑫': '67ae79674e56657bb652bd02f7251474'}
    receive = input('欢迎光临,输入您的身份,新用户(1),老客户(2)\n')
    if receive == '1':
        user, password = register(database)
        store(user, password, database)
        print(database)
    elif receive == '2':
        verify(database)

实验结果

欢迎光临,输入您的身份,新用户(1),老客户(21
输入你的用户名
肖鑫
用户名已存在,请重新输入
输入你的用户名
hello
输入你的密码:
Lyy1314520!
输入你的验证码:
XtvzG
验证通过,欢迎光临
{'肖鑫': '67ae79674e56657bb652bd02f7251474', 'hello': '67ae79674e56657bb652bd02f7251474'}

总结

经过上次折腾了验证码,现在拿出来用咯~这个是我第一次完全由自己编写的小程序,实现了简单的功能,是我现在想到的最好的方案,如果读者有更好的,望不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河海哥yyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值