天天看點

使用Flask模拟伺服器傳回(二)

背景:繼續使用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

             }

       }

繼續閱讀