使用数据迁移
来生成表结构
需要让模型文件和主程序建立关联
导入测试数据 进入数据库, 使用source
命令
tips:
# 如果导入内容只使用一次, 可以在使用前再进行导入, 可以减少导入错误的发生
from info.modules.home import home_blu
后期需导入上述知识点的链接!!!
后期需导入上述知识点的链接!!!
手动
创建日志文件夹:为了同事pull后运行不出现bug忽略
日志文件夹中日志文件(logs/.log*
)(设置好参数后,日志文件会循环覆盖;日志文件夹保留)空文件夹
, 可以添加.keepgit
文件来进行文件占位
flask封装
的日志语法:editor live temples
(包含了日志的位置)上下文导入
,后期给予链接!!!tips:
Flask默认日志也是使用的logging模块,两者都没有自动保存到文件中.SEO
, 路由实现时 优先考虑 后端渲染
:添加后端渲染链接
!!!添加后端渲染链接
!!!templates
文件夹render_template(index.html")
favicon
设置 # 网站的小图标对应一个固定的URL, 该图标的请求是由浏览器发起的, 而且只*请求一次*
# web应用只要实现对应的路由, 并且返回图标图片即可
@home_blu.route('/favicon.ico')
def favicon():
# app提供了一个方法send_static_file, 会读取文件的内容,包装为响应对象, 并且根据内容自动设置content-type
return current_app.send_static_file("./news/favicon.ico") # 该方法的相对路径是基于static文件夹
tips:此处是后端渲染,如果前端渲染(处理该问题),可参见:
https://blog.csdn.net/u012217533/article/details/46368251
理清思路
接口文档
(和前端协商接口, 一般由后端来完成)同步开发
(后端实现视图函数, 前端实现页面)POSTMAN
进行测试后端渲染
, 可能还需要进行前后端联调
demo:
# 不支持' ',只支持 " "
$.ajax({
url:'请求地址',
type: '请求方式: 默认是'GET',常用的还有'POST' ',
dataType: '设置返回的数据格式,常用的是'json'格式,也可以设置为'html' ',
data: '设置发送给服务器的数据',
success: '设置请求成功后的回调函数',
error: '设置请求失败后的回调函数',
async: '设置是否异步,默认值是'true',表示异步'
})
生成图片验证码 需要安装第三方包
pip install pillow
实现过程
获取和校验参数
生成图片验证码
保存验证码文字和图片key
返回图片 自定义响应对象
@passport_blu.route('/get_img_code')
def get_img_code():
# 获取参数
img_code_id = request.args.get("img_code_id")
# 校验参数
if not img_code_id:
return abort(403) # 403拒绝访问 404资源没找到 500服务器错误
# 生成图片验证码(图片&文字)
img_name, img_text, img_bytes = captcha.generate_captcha()
# 将图片key和验证码文字一起保存到数据库 redis 速度快/设置过期时间/满足键值关系
try:
rs.set("img_code_id_" + img_code_id, img_text, ex=IMAGE_CODE_REDIS_EXPIRES)
except BaseException as e:
current_app.logger.error(e) # 错误记录到日志中
return abort(500)
# 返回图片 自定义响应对象
response = make_response(img_bytes) # type: Response
# 设置响应头content-type
response.content_type = "image/jpeg"
return response
tips:此处存在数据库的改动,故try
,进而log
.
1.获取和校验参数
2.根据图片key取验证码文字
3.校验验证码文字
4.发送短信
5.保存短信验证码
6.返回json形式的发送结果
demo:
# 获取短信验证码
@passport_blu.route('/get_sms_code', methods=['POST'])
def get_sms_code():
# 获取参数
img_code_id = request.json.get("img_code_id")
mobile = request.json.get("mobile")
img_code = request.json.get("img_code")
# 校验参数
if not all([img_code_id, img_code, mobile]):
return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR]) # 返回自定义的错误码
if not re.match(r"^1[345678]\d{9}$", mobile):
return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
# 根据图片key取出验证码文字
try:
real_img_code = rs.get("img_code_id_" + img_code_id)
except BaseException as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])
# 校验图片验证码
if img_code.upper() != real_img_code: # 验证码错误
return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
# 发送短信之前, 判断用户是否存在
try:
user = User.query.filter_by(mobile=mobile).first()
except BaseException as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])
if user:
return jsonify(errno=RET.DATAEXIST, errmsg=error_map[RET.DATAEXIST])
# 生成`4位`随机短信验证码
random_num = "%04d" % random.randint(0, 9999) # 0112
# 发送短信
# response_code = CCP().send_template_sms(mobile, [random_num, SMS_CODE_REDIS_EXPIRES / 60], 1)
# if response_code != 0:
# return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])
# 保存短信验证码 redis 设置过期时间 key:手机号 value:验证码数字
try:
rs.set("sms_code_id_" + mobile, random_num, ex=SMS_CODE_REDIS_EXPIRES)
except BaseException as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])
# 输出验证码
current_app.logger.info("短信验证码: %s" % random_num)
# json形式返回发送结果
return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])
tips:
配置容联云
集成第三方短信平台
demo:
# 生成随机短信验证码
random_num = "%04d" % random.randint(0, 9999) # 0112
# 发送短信
# response_code = CCP().send_template_sms(mobile, [random_num, SMS_CODE_REDIS_EXPIRES / 60], 1)
# if response_code != 0:
# return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])
# 保存短信验证码 redis 设置过期时间 key:手机号 value:验证码数字
try:
rs.set("sms_code_id_" + mobile, random_num, ex=SMS_CODE_REDIS_EXPIRES)
except BaseException as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])
# 输出验证码
current_app.logger.info("短信验证码: %s" % random_num)