許多開發者希望在Flask應用中實現類似ChatGPT的實時響應效果:內容生成過程中持續傳輸給客戶端。然而,簡單的Flask response 對象無法滿足此需求,它會等待生成器函數完全執行后才發送結果。本文探討如何利用Flask框架實現真正的流式傳輸。
問題根源在于原始代碼直接使用response 對象包裹生成器函數,導致瀏覽器必須等待生成器完全執行才能顯示內容,與預期實時響應效果相悖。
改進方案的核心在于stream_with_context 裝飾器。 以下代碼片段展示了改進后的方法:
from flask import stream_with_context, request @app.route('/stream') def streamed_response(): def generate(): yield 'Hello ' yield request.args['name'] yield '!' return app.response_class(stream_with_context(generate()))
stream_with_context(generate()) 將生成器函數進行包裝。 stream_with_context 的作用至關重要,它確保生成器在每次 yield 后立即將數據返回客戶端,而非等待整個生成器執行完畢。 此例中,程序先返回“Hello ”,然后根據請求參數 name 返回相應名稱,最后返回“!”,實現了邊生成邊傳輸的效果。
與原始代碼相比,改進后的代碼利用 stream_with_context 避免了等待整個生成器函數執行完畢才返回數據的問題,實現了真正的流式傳輸,客戶端可以實時接收數據,從而模擬ChatGPT的實時響應效果。 需要注意的是,request.args[‘name’] 展示了參數傳遞方式,實際應用中可根據需要替換為其他數據獲取方式,例如從數據庫或其他API獲取數據。 通過這種方法,可以構建更動態和交互式的Web應用。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END