Flask流式傳輸如何模擬ChatGPT的實時響應?

Flask流式傳輸如何模擬ChatGPT的實時響應?

使用flask流式傳輸模擬chatgpt實時響應

許多應用,例如模擬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
喜歡就支持一下吧
點贊6 分享