本文是我做项目过程中记录的学习笔记,用于记录项目开发流程,第一次做项目有很多不懂的地方,本文可读性暂时很差。
我目前的学习目标是走完项目开发流程,知道独立开发一个项目并让项目上线需要经历哪些步骤,需要学到哪些知识点,现将遇到的问题记录如下:
- 发送短信功能的实现需要企业购买相关短信服务才能实现,用户使用短信服务需要根据官方提供的文档,进行学习操作;发送短信的功能也可以使用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.'}