背景:繼續使用Flask模拟伺服器的傳回。在此中,遇到一些新的問題。
環境:Python(3.6.6)+ Flask(1.0.2)+ Flask-SQLAlchemy(2.3.2)+ gunicorn(19.9.0)
安裝:
參考:使用Flask模拟伺服器傳回(一)
基本步驟同(一)。這裡記錄下中間遇到的一些問題。
問題:
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
}
}