东宝商城项目(三)——用户注册功能的实现(后端)

news2024/11/24 1:59:23

        本文是我做项目过程中记录的学习笔记,用于记录项目开发流程,第一次做项目有很多不懂的地方,本文可读性暂时很差。

        我目前的学习目标是走完项目开发流程,知道独立开发一个项目并让项目上线需要经历哪些步骤,需要学到哪些知识点,现将遇到的问题记录如下:

  • 发送短信功能的实现需要企业购买相关短信服务才能实现,用户使用短信服务需要根据官方提供的文档,进行学习操作;发送短信的功能也可以使用flask-mail模块实现。
  • redis数据库官方版是基于Linux系统设计的,Linux知识我掌握的太少了,目前难以完成在Linux系统上配置redis,在后续学习过程中补上。

 

发送短信

用户注册时,需要填写手机号,然后服务端将发送验证码给收到的手机号。

发送短信功能的实现,我们可以选择阿里云短信服务,或者腾讯短信服务;

如果仅仅需要进行发送短信测试,可以考虑选择容联云短信服务,这个会简单很多。

发送短信模块需要解决的需求:

  • 一分钟之内只能发送一次短信
  • 发给客户的验证码应该保存起来,我们选用redis数据库

flask-limiter限流

1、flask-limiter功能

flask-limiter可以对客户端的访问频率进行限制

2、key_func

limiter对象有一个很重要的形参——key_func

参数key_func是判断函数,表示以何种条件判断算一次访问

例如:

limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=["1 per day", "2 per hour"]
)

3、 表示速率限制的两种方式

  • "100 per day"、"20 per hour"、"5 per minute"、"1 per second"
  • "100/day"、"20/hour"、"5/minute"、"1/second"

4、基于FBV的简单使用

@app.route("/slow")
@limiter.limit("1 per day")
def slow():
    return "24"

5、基于CBV的限频方式

app = Flask(__name__)
limiter = Limiter(app, key_func=get_remote_address)

class MyView(flask.views.MethodView):
    decorators = [limiter.limit("10/second")] # 重点,属性名字不能修改
    def get(self):
        return "get"

    def put(self):
        return "put"

redis数据库

1、保留flask-limiter限流记录

flask-limiter限流的记录会留存在内存中,为了可靠,我们选择将记录存储在redis中;

将flask-limiter限流记录存储到redis,需要配置下列信息:

# 采用Redis保存数据,默认是内存,需要安装flask-redis
RATELIMIT_STORAGE_URL = 'redis://127.0.0.1:6379/0'
# 限制策略:移动窗口:时间窗口会自动变化
RATELIMIT_STRATEGY = 'moving-window'

2、redis简介

redis是一种非关系型数据库(NoSQL),以Key-Value形式存储数据;关系型数据库是以二维表形式存储数据。

3、redis下载

到redis官方网站下载:redis.io

4、redis的安装与配置

官方的redis是基于Linux系统设计的,并不像Windows系统的软件一样带有.exe的程序;

在Linux系统上安装配置redis详细过程,待后期补充...

redis与Python的交互

1、安装redis模块

pip install redis

2、导入模块StrictRedis

from redis import StrictRedis

 这个模块提供了strictredis对象,用来连接redis服务器,并按照不同类型提供了不同方法,进行交互操作;

 

 

 

3、限流器和redis的整合

StrictRedis对象方法:

通过__init__创建对象,指定参数host/port与指定的服务器和端口连接,host默认为localhost,post默认为6379,db默认为0。

sr = StrictRedis(host='localhost',port=6379,db=0)
# 简写
sr = StrictRedis()

根据不同类型,拥有不同的实例方法可以调用,与前面学的redis命令对应,方法需要的参数与命令的参数一致。

4、保存验证码到redis

flask-redis模块

在flask框架中,使用redis可以直接使用flask-redis支持包,它是对redis.py的扩展,使用起来非常方便;安装命令为:

pip install flask-redis

flask-redis的配置:只需要在配置文件中增加REDIS_URL的配置即可。

REDIS_URL = "redis://:password@localhost:6379/0"
flask-redis 初始化同样非常简单,只需要两行代码即可。
redis_client = FlaskRedis()
...
redis_cline.init_app(app)

 

验证手机号码

将用户提交的注册手机号码存储到redis中,在验证手机号界面,服务器向用户输入的手机号码发送验证码,用来验证redis存储的手机号和客户收到验证码的手机号是否一致。

class AuthorizationCodeResource(Resource):

    """
    提交手机号和验证码,开始验证
    """
    def post(self):
        rp = RequestParser()
        rp.add_argument('phone', type=parser.mobile, required=True)
        rp.add_argument('code', type=parser.regex(r'^\d{4}$'), required=True)
        args = rp.parse_args()
        phone = args.phone
        code = args.code

        # 从redis数据库中得到之前保存的验证码
        key = 'shopping:code:{}'.format(phone)
        try:
            real_code = redis_client.get(key) # 从redis中返回的是字节数据
        except ConnectionError as e:
            current_app.logger.error(e)
            return {'message': 'redis db connect error.'},400
        # 开始校验
        if not real_code or real_code.decode() != code:
            return {'message': 'Invalid code.'},400

        return {'phone': phone, 'msg': 'code success.'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java.util.ConcurrentModificationException: null异常

创作背景:在加强for循环中使用了remove操作 原因: 在官方文档中ConcurrentModificationException的介绍如下: public class ConcurrentModificationException extends RuntimeException 某个线程在 Collection 上进行遍历时,通…

Spring入门-IOC/DI注解管理与整合mybatis及Junit(2)

1,核心容器 前面已经完成bean与依赖注入的相关知识学习,接下来我们主要学习的是IOC容器中的核心容器。 这里所说的核心容器,大家可以把它简单的理解为ApplicationContext,前面虽然已经用到过,但是并没有系统的学习&a…

1.15日报

完成font.css global.css login.vue request.js 今天完成了前端与后端的联通,并成功响应请求。返回登录成功欣喜。 遇到的问题: 我的body设置了: margin:0; padding:0; 但是页面四周还有白色留边。原因:body设置无边框了&a…

用Scipy理解Gamma函数

文章目录Gamma函数对数Gamma函数复数域的Gamma函数Gamma函数 Γ\GammaΓ函数是阶乘的解析延拓,在概率论中非常常见,例如Gamma分布表示某个事件在某个时刻发生第nnn次的概率:Gamma分布详解 Γ\GammaΓ函数显含在Γ\GammaΓ分布中,其…

linux基本功系列之pwd命令实战

本文目录 文章目录一. pwd命令介绍二. 语法格式及常用选项2.1 语法格式2.2 常用参数三. 参考案例3.1 显示所在目录的完整路径3.2 显示符号链接的路径 -P 参数3.3 查看上一次所在的工作目录3.4 查看PWD的版本四. pwd的命令类型总结前言🚀🚀🚀 …

7、redis数据库jedis省份缓存案例

Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。 随着互联网web2.0网站的兴起…

IO流练习(三)

1.编程题 Homework01.java (1)在判断e盘下是否有文件夹mytemp,如果没有就创建mytemp (2)在e:\\mytemp目录下,创建文件hello.txt (3)如果hello.txt已经存在,提示该文件已经存在,就不要再重复创建了。 (4)并且在hello.tx…

Java加解密(八)数字证书

目录数字证书1 定义2 证书组成结构3 公钥基础设施(PKI)3.1 PKI的组成3.2 PKI的相关标准3.3 信任模型4 证书的应用场景5 证书链6 生成证书6.1 通过CA生成可信证书6.1.1 国际权威认证机构6.1.2 生成CSR6.1.2.1 使用XCA生成CSR6.1.2.2 使用OpenSSL生成CSR6.…

每日一题-力扣(leetcode)2059. 转化数字的最小运算数

传送门 题目描述 给你一个下标从 0 开始的整数数组 nums ,该数组由 互不相同 的数字组成。另给你两个整数 start 和 goal 。 整数 x 的值最开始设为 start ,你打算执行一些运算使 x 转化为 goal 。你可以对数字 x 重复执行下述运算: 如果…

AtCoder Beginner Contest 284解题报告(A-D)

A - Sequence of Strings Problem Statement You are given N strings S1​,S2​,…,SN​ in this order. Print SN​,SN−1​,…,S1​ in this order. Constraints 1≤N≤10N is an integer.Si​ is a string of length between 1 and 10, inclusive, consisting of lowe…

【Redis】Redis实现分布式锁

【Redis】Redis实现分布式锁 文章目录【Redis】Redis实现分布式锁1. 分布式锁概念2. 为什么要实现分布式锁2.1 并发安全问题3. 分布式锁的实现方案3.1 Redis实现分布式锁3.1.1 定义分布锁接口和类3.1.2 编写lua脚本3.1.3 使用线程锁3.1.4 总结在实现分布式锁之前,首…

aardio - 升级bindConfig函数,支持多属性和多子组件

一、需求分析 aardio的 winform.bindConfig() 函数,绑定后,一个组件,只能保存一个属性。 有时候需要同时保存多个属性,比如一个comobox组件,需要保存项目列表,同时保存当前选中的项目索引。当前这个bindC…

代码随想录算法训练营第十八天二叉树 java : .106 从中序与后序遍历序列构造二叉树113. 路径总和ii 112 路径总和 513.找树左下角的值

文章目录前言LeetCode 513.找树左下角的值题目讲解思路那么如何找最左边的呢?Leetcode 112 路径总和题目讲解LeetCode 113. 路径总和ii题目讲解Leetcode 106 从中序与后序遍历序列构造二叉树题目讲解前言 人的不幸在于他们不想走自己的那条路,总想走别人…

大数据必学Java基础(一百二十四):Maven的常见插件

文章目录 Maven的常见插件 一、编辑器插件 二、资源拷贝插件 三、tomcat插件 Maven的常见插件

Dubbo 服务暴露

Dubbo 服务暴露 1. 服务暴露时序图 2. 源码分析 DubboBootstrap.exportServices 从配置管理器中获取到所有的ServiceConfig实例,遍历,然后一个一个的暴露。 ServiceConfig.export 如果DubboBootstrap为空,也就没有初始化,就初…

猴子都能看懂的噪声(noise)专题

背景 除了生成各种奇形怪状与自然景观,噪声也有其他美妙的用途! 工作原因,经常接触与噪声相关的画面效果(火焰啊,画面扰动啊之类的),做的时候一知半解,傻傻分不清楚各种形态的nois…

Java文件:XWPFDocument导出Word文档

文章目录一、前言二、基本的概念三、Maven依赖(JAR)四、Word模板1.正文段落2.正文表格3.页眉4.页脚五、XWPFDocument的使用5.4导出Word文档1.word模板2.PdfTest测试类3.ISystemFileService接口4.SystemFileServiceImpl实现类5.结果六、遇到问题5.1输出为word的时候换行符无效一…

NR5G基础概念扫盲

文章目录前言BWP未完待续前言 随着人工智能、万物互联时代的到来,人类社会进入到一个新的阶段。新兴的科技产业对信息社会基础设施提出了更高的要求,对低时延、大带宽、高流量的需求,催生了5G技术,并推动其蓬勃发展。通信&#x…

【深入浅出XML】包装纯粹信息的标记语言

XMLXML的定义和概述🎶XML的定义🎶XML的最好描述🎶HTML和XML的重要区别🎶XML的文档结构🎶其他一些标记XML和优势🎶XML的优势XML解析🎶DOM解析❔解析测试🤞解析步骤🤞案例测…

在Windows部署Java的Jar包

背景 使用 Java 编写了一些有用的工具,因为不方便部署到服务器上,所以需要把 Java 生成的 jar 包在本地 Windows 上部署。 查阅了几种部署方式,认为通过 winsw 进行部署最方便。 安装 winsw 进入 winsw 的下载页面,下载 sampl…