首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

14. 练习:登录注册系统

Hi,大家好。我是茶桁。

上一节课,我们详细的介绍了文件读写的流程和原理,并用Python进行实际操作了一下。

那么这节课呢,我们利用之前所学的内容,尝试做一个小练习:建立一个登录注册系统。上节课我们在结尾的时候讲练习内容贴了出来,还记得要求吗?

那么这节课呢,因为都是一些讲过的知识点,所以在整个实现过程中我就不详细讲解了,我们重点在于介绍思想和流程。那让我们开始吧。

注册功能

我们先把大的结构写出来,一个注册功能,那首先需要接收两个参数:用户名、密码。

并且,为了防止用户注册时候输错密码导致无法登录,还需要让用户确认一遍密码:

下一步我们来细化这个框架,我们把用户名先放在一边,来挑一挑密码的刺:

首先,我们需要让密码保持安全性,那么我们对位数,组合就要有要求。这里我们简单点,必须输入6位以上吧。

然后,在确认密码的时候,肯定两次密码要一致才行。

OK,让我们补全这几个逻辑关系:

可以看得出来,我确认密码的时候输入了其他密码,判断逻辑没有问题。

继续来细化,现在的问题是,当我们输入第一次密码的时候判断有问题,或者两次密码输入不一致的时候,我们没有办法跳到一开始让用户重新输入,那么下面我们就来解决这个问题:

外面套一层循环,这样就解决了。

只有当密码正确输入的时候,循环才会结束,否则就会跳到循环的最开始,重新进行输入。

接着,我们就来看看当输入正确之后,我们如何写入文件呢?这个是我们上一节课刚讲解的课程,现在让我们来实现一下:

这样,我们就将用户名和密码以的格式以一行的形式存储到了一个文件内。并且,因为我们使用的的模式,所以每次打开指针都会是放在文件的末尾进行添加。

来,让我们看看是否成功了:

可以看到,没问题。这样,我们在之后读取的时候就可以直接读取单行,并且以的形式拿到我们说要的用户名和密码。用于验证是否存在,是否正确。

说到验证是否存在,似乎我们还没写这一段验证代码,既然文件里已经有数据了,让我们把这段代码补全吧, 我们在这个自定义函数外面写一段读取文件的代码,写在外面是因为,我们读取文件这个动作,和整个注册动作不能说毫无关系,只能说是没有关联。

还记得吗?这个函数的应用,不记得的,看我教程的上一节内容复习下。

看似我们确实成功的读取到了全部内容,可是我们细想一下,这样想有没有问题?还记得我们上一节课上对这个模式的说明吗?是读取已有文件,但是如果文件不存在,那就会报错。

可是我们在整个程序运行过程中,不能因为这个原因就不让用户继续往下走了对吧?那么我们怎么去修改呢?来,我们一起尝试下:

我们利用的特性,如果文件不存在则会创建,如果有,这将指针放在文件末尾。这样的话,这一段内容就没有问题了?为什么不用? 还不是因为太霸道,虽然新人胜旧人,但也不能就直接把旧人干掉吧。

但是是将指针放在文件末尾的,我们直接使用的话,什么内容也读不到,所以我们使用可来将指针放在了文件头的位置。

好了,继续。我们只将文件读取出来没用,需要将其中的数据放在一个变量里供我们检测,所以下一步,我们就需要创建一个变量,并且接收文件中的所有数据:

这样,我们拿到用户名和密码,并且分别放入了两个变量中。

接下来,我们对于注册那一步就需要进行判断了。

在代码中,我们判断用户名是否存在于列表中,如果存在,打印已经存在,如果不存在,则继续往下执行。将之前输入密码的循环放入了判断逻辑中。

看似问题解决了,不过新的问题又来了。虽然我们现在判断了用户是否存在,并且用户不存在的话可以继续往下执行,可是如果存在呢?我们需要的是让用户重新输入用户名,但是现在是打印完之后就结束了。所以,我们还得继续修改代码,这回简单了,和的处理用一样的方法就可以了。

我们将内的所有判断代码放入了一个循环中,那么在之后,没有向下执行内的逻辑的时候,就会跳转到最开始的循环重新执行。

不过这样似乎还是不行,那就是几遍逻辑全部执行完毕,内部的也是跳出里面那层循环,外层循环只能无限的执行下去了。

我们目前所要做的,就是在所有的代码顺利执行到密码正确确认的时候,整个函数执行就全部终止了。那有什么办法吗?

我们看到了, 然后开启了无限循环。那是不是说,如果那里不为真,就无法进入循环了?

嗯,既然这样,我们设定一个变量,在需要终止函数的时候,设定变量为就行了。

这样,在密码确认成功之后,设定为, 循环判断条件为假,无法再次进入循环。执行代码,输出, 并且跳出了循环不再继续向下执行。说明我们这一步已经没问题了。

那到这里,我们一个简易的可运行的注册方法就完成了,当然,这段代码中其实还有很多可以完善的空间,比如说,判断用户名是否存在之后,还要判断用户名是否合法,密码是否合法等等。还有就是我们一般接收账户密码的变量应该使用形式的字典,不过大多数时候,我们还要考虑效率问题。分别保存成两份是不错的选择,那么这个时候,我们就需要用到获取当前字典中所有值的方法了。以上代码在关键部位可以这样改:

总之,代码的实现是需要一步一步细细琢磨的,而且实现的方式也不是只有一种。要考虑逻辑,效率等等因素。文章最后会给到我的源码文件,现在大家先一步步的跟着我往下走吧。

登录功能

在实现登录功能之前,我们来分析一下这个功能要做的事情:

需要使用已经注册的用户信息登录

密码输入错误3次之后,锁定账户信息(不能再使用这个账户进行登录操作)

这是两个最基本的功能,既然要核对用户信息和密码,那和注册一样,我们还是需要读取文件,拿到里面的信息后传给相应的变量,用于检测。那好,我们先把注册那边实现的部分功能拿过来,就无需自己再写一遍了:

执行过后可以看到,三个变量已经分别存储了一个字典和两个列表,也就是字典存储了健值对的用户密码,以及将用户和密码再分别存储到两个列表内。

数据准备好了,接下来,我们开始定义函数吧:

那么大的框架就定义好了。现在让我们逐步开始细化这些代码。

先不看让用户继续输入密码的逻辑,我们先来看看用户名不存在的逻辑该怎么做。

当用户名不存在的时候,我们肯定是先要告知提示用户,接下来应该是让用户重新输入一次用户名。那怎么做呢?之前实现注册那边实际上已经有经验了,用循环呗,接下来,让我们完善一下:

在细化的代码中,我们用了和注册函数一样的方法,创建了一个外循环和一个内循环。原因就是我们分别需要判断用户名和密码,都需要返回来重新输入。

之前注册的循环已经讲的比较详细了,所以这里我们就不细致的讲解了,小伙伴们自己好好琢磨一下逻辑关系。

那到这里,我们还缺什么呢?看看需求,我们似乎还需要判断用户输入密码错误的次数对吧?

好的,让我们继续,从定义变量开始:

我们定义了一个的变量,因为我们只能尝试最多三次,所以我们给这个变量设定了一个3的值。

在之后的循环中,没尝试错误一次,我们就让这个变量操作,直到变为0为止。

然后,就是我们需要定义一个黑名单把用户名写入了。

这样,当我们的账户被输入错误三次之后,就会得到神的审判:关入小黑屋了。需要上供才行。(谁家这么设计产品,估计死的会很快吧?)

好了,继续往后,我们只写入了黑名单还不行,这样在执行的时候,还是无法判断用户是否输入的是锁定的账户。接下来需要做的事情,就是读取这个黑名单的文件,然后把里面的用户名全部以列表形式传到这个变量中。

再然后,我们只要在用户输入用户名的时候判断此用户是否被关小黑屋了就行了:

功能合并

现在,我们把注册和登录功能都分别完成了,那么我们现在就剩下最后一步,将两个功能合并在一起。

注册和登录的函数是现成的,那么现在我们要做的事情就是:

将读取数据的两个方法封装到一个函数内

定义一个主函数,进入进程后就执行

告知用户选择登录还是注册

在执行登录注册函数之前,初始化数据(加载读取数据的函数)

OK,让我们来实现吧:

首先是封装读取数据的函数:

注意我们这里用了, 因为我们需要使用外部定义的变量,所以必须要讲变量改成全局变量,改动才会有效。

注册登录函数不用改动,直接原封不动的粘贴过来就可以了。再来我们就需要直接进入主进程进行选择:

这样当我们输入的时候,就会直接进入这个主程序内。然后执行加载数据的函数,打印用户选择内容,然后等待用户选择并执行后续操作,如图:

而这其中我们设定一个变量来控制循环,每次执行完一次函数就会结束循环,然后需要重新执行。主要原因就是因为加载数据的方法我们写在了循环外面,所以当我们注册之后再去登录,新创建的用户并不在用户列表内,无法完成登录。所以干脆结束掉之后重新加载数据,就可以执行登录了。

能不能改善呢?可以。只是今天的课程目的已经完毕了,所以当作留给大家的练习题吧。如何优化整个程序让其更合理高效,大家试试看。然后记得在评论区给我留言。

好了,这节课到这里就结束了,相关代码可以在我的仓库里去找到。

https://github.com/hivandu/AI_Cheats/tree/main/Python

下一节课中,我们会讲解模块,系统的内置模块。我们下次见。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OzTiHTWzsYhyIDNBILb1VAzA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券