背景:因为项目需要,对接了别的部门的产品(暂且称做第三方插件)。在测试的时候(尤其一些大型系统的性能测试),为了减少这种对第三方插件的依赖,集中测试本系统的性能,往往需要开发“挡板”,即模拟第三方插件的返回。
环境:CentOS7 + Python2.7 + Flask(0.11.1)+Flask-SQLAlchemy(2.3.2) + MySQL(5.6)
步骤:
一、 环境安装
1. 安装Flask
Flask官方中文文档中有详细介绍,详情请戳:http://www.pythondoc.com/flask/installation.html#installation
注意:如果没有安装pip的,需要配置一下pip.conf文件。
1)新建文件夹:/etc/.pip
2)新建配置文件:pip.conf。写上如下内容:
[global]
index-url = http://127.0.0.1:10011/pypi/web/simple # 这里的端口号10011根据自己的环境情况配置
[install]
trusted-host = 127.0.0.1
2. 安装Flask-SQLAlchemy
# pip install flask-sqlalchemy
3. 安装Flask-mysql
# yum install python2-mysql
# pip install flask-mysql
二、脚本开发
对于Flask的详细应用,可以参考官方文档:http://www.pythondoc.com/flask/quickstart.html#quickstart
对于Flask SQLAlchemy的详细应用,可以参考官方文档:http://www.pythondoc.com/flask-sqlalchemy/quickstart.html
这里只介绍在脚本开发中遇到的一些问题:
1. 数据库的链接和模型
from flask import Flask, request, make_response # 导入Flask类
from flask_sqlalchemy import SQLAlchemy
import json
app = Flask(__name__) # 创建Flask实例
app.config['SQLALCHEMY_DATABASE_URI'] =
'mysql+pymysql://<username>:<password>@<ip>:<port>/<db name>'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
class DBModel(db.Model): # 数据库表结构
__tablename__ = '<table name>'
id = db.Column(db.Integer, primary_key=True)
c1 = db.Column(db.String(100))
c2 = db.Column(db.String(100), default="100")
def __init__(self, c1, c2="100"):
self.c1 = c1
self.c2 = c2
2. 方法要写对和全。如果遇到这种错误,先检查一下@app.route('', methods=[''])中的methods是否写全了方法:
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>
3. 复杂的返回体。
返回示例:
{
"status": "success",
"data": {
"content": [
{"username": "test1", "quota": "100"},
{"username": "test2", "quota": "100"},
]
}
}
query_recs = db.session.query(DBModel).all() # 查询出表中所有记录
data_list = []
for item in query_recs:
temp_dict = {
"username": item.c1,
"quota": item.c2
}
data_list.append(temp_dict)
res = {
"status": "success",
"data": {
"content": data_list
}
}
return make_response(json.dumps(res))
4. 获取url中的请求数据
如,http://localhost:80/api?username=admin,想要获取admin这个指时:request.args.get("username")
5. 获取请求体中的数据
如,返回体为:
{
"data": {
"id": 1,
"name": "test"
}
}
想要获取name时:req_name = json.loads(request.data)['data']['id']
6. 修改数据库中的值时,注意保存进去的格式
req_name = json.loads(reques.data)['name ']
req_content = json.loads(reques.data)['content '] # 从请求提中获取字段的值,这是一个字典类型
temp = DBModel.query.filter_by(name=req_name).first() # 查询出指定的记录,filter_by类似where语句
temp.content = json.dumps(req_content ) # 数据库中的content是varchar类型
db.session.commit()
7. 出现No Module Named MySQLdb
这是因为安装的mysql没有在venv中,重新在venv中执行一次pip install mysql-python即可
三、参考资料
1. https://blog.youkuaiyun.com/sun_dragon/article/details/51719753
2. http://www.cnblogs.com/xiaoxi-3-/p/8026504.html
3. https://www.cnblogs.com/alima/p/5734992.html