首先,需要知道的是flask是什么?flask是非常非常简单的接口部署工具(当然,也可以用来做前端开发),简单到只需要最简单的几行代码既可在本地调用接口;也是博主在公司常用的一个库,非常的轻量级!!接下来,我会用我写的一个mock接口进行讲解,该mock接口是集成了本项目的数个接口,然后统一集成为一个mock接口,提供给公司其他组同事调用;该接口的功能就是创建一个团购券,然后将团购券的券id通过接口返回出去;
pip install flask
全文由项目结构、核心层级详解组成
先说下api文件夹,这个文件夹下主要一个接口一个文件
其中的add.py文件就是groupone服务的add应用;同理,groupone服务的del应用,select应用也都会存在groupone文件夹下,以便管理
com_tools通用工具层是该mock项目的一些通用模块,如生成日志,数据库取值,获取登录状态等等自定义模块
files外部文件层,主要存放一些需要用的外部文件,如图片,配置文件,excel表格等等
这个是和api层一样重要的目录,api层所需要的的数据来源,都放在libs层进行运算处理
groupon_utils.py文件就是api层中的groupon文件夹中所有文件的数据来源,包括但不限于add.py文件
就是普通的日志存储位置
该文件是最核心的初始化文件,也是接口的服务文件,下面的层级详解中,会详细讲述;文件名自定义即可,不用按照博主的名字去编写;但是建议不要使用init,防止和python关键字冲突
先上代码,关于代码的解释,已经在码中进行了解析
from flask import Blueprint #引入flask的蓝图模块
from flask import request #引入flask的request模块,获取接口入参
from libs import groupon_utils
from com_tools import log_create
blueprint = Blueprint("groupon",__name__) # blueprint要被init文件调用
@blueprint.route('/add',methods=['POST']) #接口应用名为add 接口的调用方式为host + 该蓝图blueprint的url_prefix+add 例如该接口 http://127.0.0.1:6767/groupon/add
def add_groupon():
"""新增团购劵
只支持post方法,且入参只能是json格式
"""
log_create.logger.logger.debug("创建团购券接口被调用,入参为:%s"%request.data)
global host,utils
pid = request.json.get("pid") #店铺id
name = request.json.get("name") #团券名称
price = request.json.get("price") #售价
env = request.json.get("env") #环境
left = request.json.get("left") #库存
#判断代码执行环境
if str(env).lower() == "qa":
host = "内部信息,不展示了,这里输入你代码执行的环境对应的host"
else:
data = {"code": 99997, "errmsg": "env参数异常,请输入qa/pl/ol,pl和ol暂不支持", "data":""}
log_create.logger.logger.debug("创建团购券接口被调用,响应参数为:%s" % data) #写入日志
return data
#非必填参数left
if left is not None:
utils = groupon_utils.Groupon_Utils(pid=pid, name=name, price=int(price), base_url=host,left=left) # 创建Groupon_Utils的类实例
else:
utils = groupon_utils.Groupon_Utils(pid=pid, name=name, price=int(price), base_url=host)
result = utils.select_groupon()#通过实例对象调用类的函数
if result["code"] == 0:
cardTemplateId = result["data"]["cardTemplateId"]
data = {
"code": 0,
"errmsg":"成功",
"data":{
"cardTemplateId":cardTemplateId,
}
}
log_create.logger.logger.debug("创建团购券接口被调用,响应参数为:%s" % data)
return data
else:
log_create.logger.logger.debug("创建团购券接口异常,响应参数为:%s" % result)
return result
上诉代码中需要注意到的是,该段代码并不能独立运行,所以入参是否正常取到,返回是否生效,都需要配合libs层文件和init文件一起执行才能判断
还是不多说,边看代码边看解析吧
import requests,time,datetime,json
from com_tools import get_value_Utils,login_Utils,log_create
session = requests.session()#python的requests库的session实例化
class Groupon_Utils(): #创建一个团购操作类
def __init__(self,pid,name,price,base_url,wid=2995903,left=1): #类的初始化文件,类被实例化时,均会调用该方法
log_create.logger.logger.debug("Groupon_Utils()的入参为:pid=%s,name=%s,price=%s,base_url=%s,wid=%s,left=%s" % (pid,name,price,base_url,wid,left))
re = login_Utils.Login_Utils(pid=pid,wid=wid) #登录操作的实例化
self.pid = pid #将入参转化为类方法可以调用的参数
self.wid = wid
self.name = name
self.price = price
self.base_url = base_url
self.Authorization = "Bearer " + re.login_pc('token') #获取登录身份
self.B_cookie = re.login_pc('cookie') #同获取登录身份,这两个参数都是根据自身业务所需进行编写,你进行数据运算,接口调用,需要身份权限时,就设置对应的方法即可,例如博主就是在com-tools中有个登录操作模块,专门获取登录身份
self.left = left
def create_groupon(self): # 创建团购券,调用创建团购券接口
url = str(self.base_url) + "敏感信息,不展示了,这里需要替换成你自己需要的接口位置"
log_create.logger.logger.debug("创建团购券接口的变量信息为startDate=%s,expireDate=%s,detail_name=%s,url=%s" % (startDate,expireDate,detail_name,url))
data = "这里输入json格式的参数信息,如果你不清楚什么事json格式的参数,可以抓个包看看"
headers = {
"channel-type":"pc",
"Content-Type" : "application/json;charset=UTF-8",
"Cookie": self.B_cookie,
"Authorization":self.Authorization,
} #headers头部信息
log_create.logger.logger.debug(
"创建团购券接口的入参信息为data=%s" % (data))
log_create.logger.logger.debug(
"创建团购券接口的请求头信息为headers=%s" % (headers))
response = session.post(url=url,json=data,headers=headers) # 执行该接口请求
if json.loads(response.text)["errcode"] == 0: #对接口请求进行判断
return 0
else:
data = {"code": 99998, "errmsg": "创建团购券失败", "data": response.text}
return data
def select_groupon(self):
#根据创建时间倒序排列
create_result = self.create_groupon()#查找券id之前,先创建券
if create_result == 0:
url = self.base_url + "敏感信息,这里同上"
data = "同上"
headers = {
"channel-type":"pc",
"Content-Type" : "application/json;charset=UTF-8",
"Cookie": self.B_cookie,
"Authorization":self.Authorization,
}
response = session.post(url,json=data,headers=headers)
for i in range(len(json.loads(response.text)["data"]["items"])): #这是一个for循环,去遍历所有的接口返回值中的选项,通过这个方式,拿到需要查找的数据,其实还可以通过正则的方式来获取,这里就不做讲述了
if json.loads(response.text)["data"]["items"][i]["name"] == self.name:
cardTemplateId = json.loads(response.text)["data"]["items"][i]["cardTemplateId"]
data = {"code": 0, "errmsg": "查询成功", "data": {"cardTemplateId":cardTemplateId}}
return data
else:
data = {"code":99999,"errmsg":"查询cardTemplateId失败","data":response.text}
return data
else:
return create_result
这段代码需要注意的就是,尽可能的将api层中的每一个目录都做成一个单一的类,这样方便管理
from flask import Flask
#导入的是api中的蓝图对象
from apis.groupone.add import blueprint #导入蓝图
#总驱动文件
app = Flask(__name__)# 我也不清楚这个为啥要这么写,也不清楚括号内改动有啥用,有知道的大佬,可以评论指出来
app.register_blueprint(blueprint,url_prefix='/groupon')#注册我们在add.py模块中创建的蓝图实例blueprint, 并将他的URL前缀设置为`/groupon`;前缀我们尽量使用api层的次一级目录,这样好管理
if __name__ == '__main__':
app.run(host='0.0.0.0',port=6767,debug=False,threaded=True)
是的,你没有看错,init文件就是这么简单! 这个接口在本地调用的URL就是http://127.0.0.1:6767/groupon/add 入参要求的是json格式的pid,name,price,env,请求方式要求是post
flask框架的一个简单的安装和使用就到这里拉,后续我会写关于flask框架怎么部署到服务器,以及我在部署服务时遇到的坑