許多應用,例如模擬ChatGPT的實時聊天或大型文件下載,都需要邊生成邊傳輸數據,避免客戶端長時間等待。本文演示如何在python Flask框架中實現這種流式傳輸,并修正原代碼中的缺陷。
原代碼嘗試使用yield實現流式傳輸,但由于response對象在generate()函數結束后才返回,瀏覽器必須等待所有數據生成完畢才能顯示內容,與實時響應預期不符。
問題代碼:
from time import sleep from flask import Flask, Response, stream_with_context app = Flask(__name__) @app.route('/stream', methods=['GET']) def stream(): def generate(): for i in range(1, 21): print(i) yield f'this is item {i}n' sleep(0.5) return Response(generate(), mimetype='text/plain') if __name__ == '__main__': app.run(debug=True)
解決方法:正確使用Flask的stream_with_context裝飾器。該裝飾器確保每次yield都立即返回數據給客戶端,實現真正的流式傳輸。改進后的代碼:
from flask import stream_with_context, request, jsonify @app.route('/stream') def streamed_response(): def generate(): yield 'Hello ' yield request.args.get('name', 'World') # 使用get()避免KeyError yield '!' return jsonify({'message': list(stream_with_context(generate()))}) # 返回JSON格式
stream_with_context包裹了generate函數,使每次yield都立即發送數據。 示例中數據生成簡單,實際應用中generate函數可能包含更復雜的邏輯(例如數據庫查詢或復雜計算),但stream_with_context的作用仍然是確保數據及時傳輸。 request.args.get(‘name’, ‘World’)從請求參數獲取數據,實現更靈活的流式傳輸,并使用get()方法處理缺失參數的情況,避免KeyError錯誤。 最后,使用jsonify將結果封裝成JSON格式返回,更適合前端處理。
通過以上改進,可以有效模擬ChatGPT的實時響應效果。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END