自己學習Flask+Gevent, 做了一個小接口服務器, 但在收到請求后, 打印請求的報文, 並返回正確格式, 運行后會出現收到請求消息后,Flask卡住無響應的的問題, 有時候點擊ctrl+C才能繼續執行, 網上找過很多方法, 但最后從http.server這個框架中找到了靈感, 因為http.server中如果獲取報文時, 同樣會出現卡住, 或處理等待30s以上才能響應, 針對Flask, 我也用了相同的思路, 果然速度快了, 也不卡和無響應了.
代碼如下:
@app.route('/alert', methods=['POST']) def req_alert(): print('---------------------') print(request.headers) if request.data == b'': print('請求數據格式為空!') abort(401) if request.is_json: req_str = request.data[0:int(request.content_length)] req_data = json.loads(req_str, encoding='utf-8') print_req_data(req_data) else: print('請求數據格式不是Json格式') abort(401) print('---------------------\n') headers = request.headers try: if req_data['action'] != 'alert' and req_data['action'] != 'alert_release': abort(401, 'Invalid action') if headers['message-type'] != 'alert': abort(401, 'Invalid message-type') alert_id = req_data['alert_id'] res_data = { 'result_code': '1', 'result_desc': 'Success', 'timestamp': int(time.time()), 'data': {'alert_id': alert_id} } return res_data except KeyError: abort(401, 'Invalid req data') except Exception as e: abort(401, 'Invalid req data')
重點在獲取報文時是先獲取request.content_length, 在通過報文長度直接從request.data中截取有效的信息長度即可. 這樣處理速度加快, 也沒有再出現卡住的現象. 為什么直接調用request.data, 或request.get_json或其他方式會有卡住的情況, 我具體沒有研究, 我個人懷疑是請求的報文信息中除了有效長度內容外, 還有其他信息會占用緩存導致. 寫的膚淺, 還請大神指點.
補充:
經過自己一段時間的驗證和實踐, 上面的方法, 確實可以解決一部分的卡頓的原因. 但真正卡頓的原因還是跟CMD執行有關. 上網查了一些資料, 解決方式如下:
1. 打開CMD命令行窗口
2. 在右擊窗口欄, 選擇默認項
3. 取消勾選快速編輯功能
4. 保存.
好多CMD執行腳本時會卡住大多數都是因為這個功能引起的. 希望大家能借鑒.