Flask 卡住, 無響應問題


自己學習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執行腳本時會卡住大多數都是因為這個功能引起的. 希望大家能借鑒.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM