背景:继续使用Flask模拟服务器的返回。在此中,遇到一些新的问题。
环境:Python(3.6.6)+ Flask(1.0.2)+ Flask-SQLAlchemy(2.3.2)+ gunicorn(19.9.0)
安装:
基本步骤同(一)。这里记录下中间遇到的一些问题。
问题:
1.添加返回头信息。
1)将token添加到response的头部。
response.headers['X-Subject-Token']='abcde...'
2)添加接受的格式信息
response.headers['Content-Type']='application/json; charset=UTF-8'
2.返回中存在中文字符
if __name__ == '__main__':
app.config['JSON_AS_ASCII'] = False
app.run(host='0.0.0.0', port=<port>, debug=True)
3.多个app的情况
这里,由于拿token走的是port1,其余接口走的是port2。而Flask是单线程的,因此这里用了两种方法来解决这个问题。
1)方法一:这个方法比较笨,但是简单有效。即,把走token的接口放到script1.py,其余接口放到script2.py。
script1.py:
if __name__ == '__main__':
app.config['JSON_AS_ASCII'] = False
app.run(host='0.0.0.0', port=<port1>, debug=True)
script2.py:
if __name__ == '__main__':
app.config['JSON_AS_ASCII'] = False
app.run(host='0.0.0.0', port=<port2>, debug=True)
找两个客户端分别启动:
# python36 script1.py
# python36 script2.py
2)方法二:使用gunicorn
gunicorn的安装细节找度娘问一下即可。本人这里直接使用pip36 install gunicorn进行安装。
A. 脚本中无论走哪个port的接口都放在同一文件中(这里文件名:test_flask.py)
B. 不同端口的app定义和使用不同。
app01 = Flask('app01') // 供port1使用
app02 = Flask('app02') // 供port2使用
使用时,走port1的端口路由就这样写:
@app01.route()
走port2的端口路由就这样写:
@app02.route()
C. 去掉main方法。
D. 在命令行运行:
# gunicorn -b 0.0.0.0:<port1> test_flask:app & // & 表示放到后台运行
# gunicorn -b 0.0.0.0:<port2> test_flask:app & // & 表示放到后台运行
4.返回体和状态码
1)无响应体返回时
return None
2)返回指定的状态码
return "OK", 204
5.条件查询
接口: GET /api/resources/<id>
表的类:
class T_Res(db.Model):
__tablename__ = 't_res'
...... # 表的定义省略
@app.route('/api/resources/<req_id>', methods=[GET])
def get_resource(req_id):
item_list = T_Res.query.filter(T_Res.id == req_id).first()
res = {
"data": {
res_id: item_list[0].id # 查询出的数据组成了一个list
res_name: item_list[0].name
}
}