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

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

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

  • 发送短信功能的实现需要企业购买相关短信服务才能实现,用户使用短信服务需要根据官方提供的文档,进行学习操作;发送短信的功能也可以使用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.'}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天自洽了吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值