Flask框架进阶-Flask流式输出和受访配置--纯净详解版

Flask流式输出🚀

       在工作的项目当中遇到了一种情况,当前端页面需要对某个展示信息进行批量更新,如果直接将全部的数据算完之后,再返回更新,则会导致,前端点击刷新之后等待时间过长,开始考虑到用进度条或者流式输出的方式,但是由于进度条的计算前端页面的设计都需要改动会增加额外的工作量,因此考虑使用流式输出的方式,前端接收一个或一部分更新一个或一部分,因此就需要用到Flask框架中的流式输出的功能,其次,例如如果想要自己实现大语言模型的流式输出的效果,那这也是一项绕不开的学习点。

Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版


文章目录

  • Flask流式输出🚀
  • 1.Flask流式输出基础代码+浏览器访问
  • 2.使用requests库接收流式输出的返回
  • 3.设置跨域
  • 4.设置响应头和响应类型
  • 5.设置SSE格式输出
  • 结束

1.Flask流式输出基础代码+浏览器访问


       Flask作为服务端的基础代码如下,先从简单的开始,下面会对代码中的部分再进行解释:

import timefrom flask import Flask, Response
app = Flask(__name__)@app.route('/stream')
def stream_numbers():def generate_numbers():for number in range(1, 10):yield f"{number}\n"  # 每次生成一个数字就发送 \n 最好不要删除time.sleep(0.5)  # 为了演示,加入短暂延迟return Response(generate_numbers())if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)

       先给出直接使用浏览器的访问结果。这里我也观察到了好像是从2开始流输出,似乎是前一秒的数据会先缓存然后直接打印出来,然后后面的再正常流式输出,如果是用代码的话几乎不会有这个问题。
在这里插入图片描述

2.使用requests库接收流式输出的返回


       在python中可以使用通过requests库来接收流式输出的web服务格式,下面给出代码,运行下面代码之前别忘了把启动Flask服务的代码先运行起来。

import requestsdef stream_from_server(url):response = requests.get(url, stream=True)  # Ensure you set stream=Truefor message in response.iter_lines():print("Received:", message.decode())if __name__ == "__main__":stream_from_server("http://localhost:5000/stream")

在这里插入图片描述

3.设置跨域


跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种安全功能,它允许一个网页的资源能够被其他域名(origin)的网页访问。默认情况下,浏览器的同源策略会阻止从一个域中加载的网页去请求另一个域的资源。这是为了防止恶意网站访问或操作用户数据。

       由于目前公司里前端的同事使用的都是js,在使用js访问我们python的服务的时候,有很多奇怪的现象,如果我如果不开跨域,js的同事也能访问到我的数据,但实现不了流式输出的格式,等等,因此在开发python服务的时候,开着跨域能节省很多麻烦。在python中实现跨域需要安装一个新的库。flask_cors。

pip install flask_cors

在安装成果之后从flask_cors导入CORS然后给app套一层CORS(app, resources="/*")就可以实现跨域resources这个是设置允许跨域访问我们的地址,设置成"/*"表示允许所有地址k跨域访问我们。

from flask import Flask, Response
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources="/*")

完整代码如下:

import time
from flask import Flask, Response
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources="/*")@app.route('/stream')
def stream_numbers():def generate_numbers():for number in range(1, 10):yield f"{number}\n"  # 每次生成一个数字就发送time.sleep(0.5)  # 为了演示,加入短暂延迟return Response(generate_numbers())if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)

4.设置响应头和响应类型


js前端对于接收我们的要求非常苛刻,跨域开了之后,要服务器发送事件(Server-Sent Events, SSE)输出,还要响应头的内容类型对上,然后还得再响应头里把,时间类型,是否缓存,是否有响应缓冲都设置上,才能确保正常显示流式输出操作,增加了响应头和配置响应头相关内容的代码如下。

import time
from flask import Flask, Response
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources="/*")@app.route('/stream')
def stream_numbers():def generate_numbers():for number in range(1, 10):yield f"{number}\n"  # 每次生成一个数字就发送time.sleep(0.5)  # 为了演示,加入短暂延迟headers = {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache','X-Accel-Buffering': 'no',}return Response(generate_numbers(),headers=headers)if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)

响应头中的配置的内容解释如下。

  1. Content-Type: text/event-stream(必须要):
    • 这个响应头对于服务器发送事件(SSE)至关重要,这是一种从服务器向客户端推送事件的标准方式。它告诉客户端响应是一个事件流,客户端应该保持连接打开,并准备接收多个事件。
  2. Cache-Control: no-cache(必须要):
    • 这个头部指示浏览器或其他中间代理不要缓存当前的响应。在实时数据传输和事件流中,保证客户端接收的是最新的数据非常重要,而不是从缓存中提取的可能已经过时的数据。
  3. X-Accel-Buffering: no(这个看情况使用):
    • 这是一个非标准的响应头,主要用于控制Nginx反向代理服务器的缓冲行为。设置为no意味着禁止Nginx缓冲这个响应,这对于实时数据流非常重要,因为缓冲可能会导致数据延迟到达客户端。这个设置确保数据能够尽可能快地直接传输给客户端。

5.设置SSE格式输出


然后SSE格式的输出说明参考GPT-4。


       服务器发送事件(Server-Sent Events, SSE)是一种允许服务器主动向浏览器或客户端发送信息的技术。SSE 通常用于创建到服务器的单向持久连接,服务器可以通过这个连接发送任意数量的消息。这种方法主要用于实时应用,如实时通知、股票行情更新等。

SSE 数据的格式比较简单,以下是一个基本的示例:

data: This is a message

       每条消息都以一个或多个以 “data:” 开头的行组成,后面跟随实际的消息内容,最后以一个空行结束,表示消息的结束。客户端会在收到空行后处理消息。

       除了基本的消息外,SSE 还支持为消息指定事件类型和ID,这样客户端可以更精确地控制不同类型的消息处理。以下是一个包含事件类型和ID的完整示例:

plaintextCopy codeid: 1
event: user-update
data: { "username": "alice", "time": "2024-04-28T12:34:56Z" }
  • id: 这个字段是可选的,用于设置消息的唯一标识。在客户端断开连接后重新连接时,可以通过发送最后接收到的ID来请求服务器发送丢失的消息。
  • event: 也是可选的,指定事件的类型。客户端可以基于事件类型来决定如何处理接收到的数据。
  • data: 包含实际的消息内容。如果消息数据跨多行,每一行都需要以 “data:” 开始。

在上述代码的基础上我们要进行如下的改动,才能保证js使用EventSource接口接收正常。

  1. 将输出整体改成SSE格式
  2. 将SSE各种中的data变为json格式
  3. 再返回完主要内容之后最后还要额外返回一次done给出截至条件。

json.dumps()将字典转换为json格式

import json
import timefrom flask import Flask, Response, json
from flask_cors import CORSapp = Flask(__name__)
CORS(app, resources="/*")@app.route('/stream')
def stream_numbers():def generate_numbers():for number in range(1, 10):json_data = json.dumps({"number": number})yield f"data: {json_data}\n"  # 每次生成一个数字就发送time.sleep(0.5)  # 为了演示,加入短暂延迟json_data = json.dumps({"number": "done"})yield f"data: {json_data}\n"  # 发送完成信号headers = {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache','X-Accel-Buffering': 'no',}return Response(generate_numbers(), headers=headers)if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)

接收结果:
在这里插入图片描述

结束


       以上技术就是实现一个自己的网页然后模拟ChatGPT流式输出的一块重要拼图,目前找了我的一个学弟用vue负责做前端,去做一下这个小项目,已经基本完成,之后会开源前后端代码和gitee的地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

liceo靶机复现

liceo-hackmyvm 靶机地址:https://hackmyvm.eu/machines/machine.php?vmLiceo 本机环境:NAT模式下,使用VirtualBox 信息收集: 首先局域网内探测靶机IP 发现IP为10.0.2.4 开启nmap扫描一下看看开了什么端口 扫描期间看一下web页…

[蓝桥杯2024]-PWN:fd解析(命令符转义,标准输出重定向,利用system(‘$0‘)获取shell权限)

查看保护 查看ida 这里有一次栈溢出,并且题目给了我们system函数。 这里的知识点没有那么复杂 方法一(命令转义): 完整exp: from pwn import* pprocess(./pwn) pop_rdi0x400933 info0x601090 system0x400778payloa…

78、贪心-跳跃游戏

思路 方法1: canJump01 - 使用递归(回溯法) 这个方法是通过递归实现的,它从数组的第一个位置开始,尝试所有可能的跳跃步数,直到达到数组的最后一个位置或遍历完所有的可能性。 思路: 如果数组为空或者长…

【docker】docker compose 搭建私服

安装 Docker Registry 创建目录 mkdir -pv /usr/local/docker/registrymkdir -pv /usr/local/docker/data 创建 docker-compose.yml文件 进入目录创建docker-compose.yml cd /usr/local/docker/registrytouch docker-compose.yml 编辑docker-compose.yml vim docker-compo…

2024年【起重机械安全管理】考试内容及起重机械安全管理操作证考试

题库来源:安全生产模拟考试一点通公众号小程序 起重机械安全管理考试内容根据新起重机械安全管理考试大纲要求,安全生产模拟考试一点通将起重机械安全管理模拟考试试题进行汇编,组成一套起重机械安全管理全真模拟考试试题,学员可…

52.HarmonyOS鸿蒙系统 App(ArkTS)配置文件添加多个权限方法

52.HarmonyOS鸿蒙系统 App(ArkTS)配置文件添加多个权限方法 module.json5

VS2022 嘿嘿

还是大二的时候就开始用这个,但居然是为了用PB,-_-|| 用了段时间换成了C#,依稀还记得大佬们纠正我的读法,别读C井,应该读C夏普。。。 安装过程其实也没啥,就是关键Key得花时间找,我好不容易搞…

Concise CoT(CCoT)提示词工程

原文地址:concise-chain-of-thought-ccot-prompting 2024 年 1 月 24 日 传统的 CoT 是以增加输出令牌使用为代价的,CCoT 提示是一种提示工程技术,旨在减少 LLM 响应的冗长和推理时间。 基于LLMs的生成式人工智能应用程序必须使用多管齐下的方…

php使用Canal监听msyql

canal需要java8 去官网下载java8 安装JAVA #创建目录 mkdir -p /usr/local/java/ #解压到目录 tar zxvf jdk-8u411-linux-x64.tar.gz -C /usr/local/java/配置环境变量在 /etc/profile 最后加入 export JAVA_HOME/usr/local/java/jdk1.8.0_411 export CLASSPATH.:$JAVA_HOM…

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目: https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本,递归版本有 测试用…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt+hadoop + redis 医院就诊系统 设计与实现

一.项目介绍 前端:患者注册 、登录、查看首页、医生排班、药品信息、预约挂号、就诊记录、电子病历、处方开药、我的收藏 后端分为: 医生登录:查看当前排班信息、查看患者的挂号情况、设置患者就诊记录、电子病历、给患者开药和个人信息维护 …

公共交通无障碍设施:科技翅膀助力盲人出行新飞跃

在城市的脉络中,公共交通扮演着连接每一个角落的重要角色。然而,对于视力受限的盲人朋友而言,这幅繁忙而复杂的交通网络往往隐藏着诸多不易察觉的障碍。值得庆幸的是,随着公共交通无障碍设施的不断完善,以及高科技辅助…

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM 2024/5/2 16:29 1、默认编译为AMD64/INTEL的x64架构的可执行文件: rootrootrootroot-ThinkBook-16-G5-IRH:~$ rootrootrootroot-ThinkBook-16-G5-IRH:~$ unzip Quectel_QConnectManager_Lin…

CSS-复合选择器

作用&#xff1a; 后代选择器&#xff1a; 子代选择器 并集选择器 用逗号隔开&#xff0c;在style里面写的时候&#xff0c;每一个标签空一行。 <title>Document</title><style>p,div,span{color: aqua;}</style> </head> <body><p>…

C语言——队列的实现

队列按照先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则管理数据。这意味着最先进入队列的元素会被最先移出&#xff0c;类似于排队等候服务的情况。队列通常有两个主要操作&#xff1a;入队&#xff08;enqueue&#xff09;&#xff0c;将元素添加…

python - 3D图表绘制

Pyecharts 和 3D 图表绘制 Pyecharts 是一个用于生成各种图表的 Python 库&#xff0c;它基于 Echarts&#xff0c;支持大量的图表类型&#xff0c;非常适合用于数据分析和可视化。Pyecharts 主要优点是易于使用&#xff0c;可以直接在 Python 环境中绘制富有交互性的图表&…

ES练习项目-酒店搜索

目录 1 需求分析2 酒店搜索和分页2.1 请求和响应分析2.2 定义实体类&#xff0c;接收请求参数的JSON对象2.3 编写controller&#xff0c;接收页面的请求2.4 编写业务实现&#xff0c;利用RestHighLevelClient实现搜索、分页 3. 酒店结果过滤3.1 请求和响应分析3.2 修改请求参数…

结合创新!频域+时间序列,预测误差降低64.7%

频域时间序列不仅能提供更丰富的信息&#xff0c;还能提高模型性能和预测准确性。对于论文er来说&#xff0c;是个可发挥空间大、可挖掘创新点多的研究方向。 具体来说&#xff1a; 通过将复杂的时间序列数据转换成简单的频率成分&#xff0c;我们可以更容易地捕捉到数据的周期…

【人工智能基础】逻辑回归实验分析

实验环境&#xff1a;anaconda、jutpyter Notebook 实验使用的库&#xff1a;numpy、matplotlib 一、逻辑回归 逻辑回归是一个常用于二分类的分类模型。本质是&#xff1a;假设数据服从这个分布&#xff0c;然后使用极大似然估计做参数的估计。 二、实验准备 引入库、预设值…

Sam Altman:那些我希望有人能早点告诉我的事

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…