关于Flask模块化开发方式
可以使用两个后端代码来分别控制不同的模块。在 Flask 和 Waitress 这样的框架中,这通常通过以下几种方式来实现:
- 使用蓝图 (Blueprints): Flask 提供了蓝图功能,允许你将应用程序的不同部分拆分为多个模块。这些蓝图可以分别处理不同的逻辑或功能区域,最后将它们组合到主应用程序中。
- 启动多个 Waitress 实例: 你也可以启动多个 Waitress 实例,每个实例服务于一个不同的 Flask 应用。这样你可以通过不同的端口或者不同的 URL 路径来分别控制不同的模块。
我们现在来采用第二个方法,启动多个 Waitress 实例,每个实例服务于一个不同的 Flask 应用。
端口问题
在同一个端口(例如 5000)上运行多个后端服务是不可能的,因为一个端口在同一时间只能由一个应用程序占用。
- 使用不同端口
如果没有特别的需求必须使用同一个端口,可以为不同的服务使用不同的端口来避免冲突。例如,你可以这样运行两个服务:
waitress-serve --port=5000 first_pythonfile:app
waitress-serve --port=5001 second_pythonfile:app
其中 :app 前面的是你的后端代码名称。
然后,通过 http://localhost:5000
和 http://localhost:5001
分别访问不同的后端服务。
修改vue.config.js
如果你使用不同的端口来运行后端服务,那么你的 Vue 项目也需要调整配置,以便正确地与后端通信。通常,你需要在 vue.config.js
中设置代理 (proxy),这样 Vue 应用在开发环境下的请求可以正确地转发到不同的后端端口。
例如,假设你有两个后端服务,分别在端口 5000
和 5001
上运行。你可以在 vue.config.js
中配置代理来转发不同路径的请求到相应的后端服务。
接下来我们提供一种最简便的方式来进行修改。
如果你希望保留现有的 API 路径 (axios.get('/api/YOUR_query')
),并且不希望修改前端的请求路径,你可以通过在 vue.config.js
的代理配置中进一步处理路径,避免手动更改前端代码。
你可以直接使用代理,将 /api
请求动态地转发到不同的后端服务,具体实现方式如下:
- 修改vue.config.js
你可以配置代理,将 /api
路径分别转发到不同的后端服务,甚至可以根据请求路径的不同部分来决定将请求发送到哪个后端。
module.exports = {
devServer: {
publicPath: process.env.VUE_APP_PUBLIC_PATH || '/',
proxy: {
// 代理所有 /api 请求到主后端服务
'/api': {
target: 'http://localhost:5000', // 主后端服务
changeOrigin: true,
pathRewrite: { '^/api': '' }, // 如果后端不处理 /api 前缀,则重写路径
},
// 代理 /api2 请求到第二个后端服务
'/api2': {
target: 'http://localhost:5001', // 第二个后端服务
changeOrigin: true,
pathRewrite: { '^/api2': '/api' }, // 将 /api2 转换成 /api
},
},
disableHostCheck: process.env.NODE_ENV === 'development',
},
}
- 这是一种不修改前端代码的解决方案:
- 保持前端代码不变: 你不需要在前端代码中修改路径,比如
axios.get('/api/YOUR_query')
。 - 动态代理配置:
/api
请求会自动转发到第一个后端(localhost:5000
)。- 如果需要将某些请求转发到第二个后端(
localhost:5001
),你可以配置/api2
代理,并通过pathRewrite
将/api2
的路径重写为/api
。
通过这种配置,假设你只想把某些 API 请求转发到不同的服务(如 api2
),可以在 Vue 配置中做相应调整,而不需要改动前端的代码。
如果你的 axios
调用是 /api/EBAP_query
,这个路径会根据 proxy
的配置,决定转发到哪一个后端服务。
- 同样也不需要修改后端代码
通过在 vue.config.js
中使用代理配置,前端的请求会自动转发到不同的后端服务,而后端代码保持不变。
具体原因是:
- 前端代码依然使用
axios.get('/api/YOUR_query')
发起请求,不需要进行任何改动。 - 在
vue.config.js
中,通过代理将/api
路径根据你设置的规则转发到不同的后端服务(例如localhost:5000
或localhost:5001
)。 - 后端的 URL 路径(如
/api/YOUR_query
)也保持不变,不需要对其进行任何修改。
你可以继续使用两个独立的 Flask 后端服务(一个在 5000
端口,另一个在 5001
端口),它们接收从 Vue 应用传递来的相同 API 请求路径,比如 /api/YOUR_query
,并分别处理。
完整的操作流程:
-
前端代码保持不变:
axios.get('/api/YOUR_query').then(response => { console.log(response.data); });
-
在
vue.config.js
中配置代理:module.exports = { devServer: { publicPath: process.env.VUE_APP_PUBLIC_PATH || '/', proxy: { // 代理所有 /api 请求到主后端服务 '/api': { target: 'http://localhost:5000', // 主后端服务 changeOrigin: true, pathRewrite: { '^/api': '' }, // 如果后端不处理 /api 前缀,则重写路径 }, // 代理 /api2 请求到第二个后端服务 '/api2': { target: 'http://localhost:5001', // 第二个后端服务 changeOrigin: true, pathRewrite: { '^/api2': '/api' }, // 将 /api2 转换成 /api }, }, disableHostCheck: process.env.NODE_ENV === 'development', }, }
-
后端服务依然监听相同的 URL 路径:
- Flask 后端 1(运行在端口
5000
) 继续处理/api/YOUR_query
。 - Flask 后端 2(运行在端口
5001
) 也处理/api/YOUR_query
(通过代理/api2
转发过来的请求)。
- Flask 后端 1(运行在端口
这样,你不仅不需要修改前端代码,还能够在后端保持现有的 API 设计,同时实现对不同后端服务的请求分配。
你现在可以写两个后端代码了,分别处理不同的请求路径。
具体操作步骤:
- 后端 1:继续使用当前的后端代码,并运行
waitress-serve --port=5000 first_pythonfile:app
来启动。 - 后端 2:编写新的后端代码,并通过
waitress-serve --port=5001 second_pythonfile:app
来启动新后端服务。 - 前端请求:
- 对于现有后端的请求,仍然使用
axios.get('/api/YOUR_query')
,它将会被代理到第一个后端服务。 - 对于新的后端请求,使用
axios.get('/api2/YOUR_query')
,这会通过代理转发到第二个后端服务。
- 对于现有后端的请求,仍然使用
通过这种方式,你的前后端代码能够很好地配合,无需在前端大规模调整,并且能够同时运行多个 Flask 应用。
在这种架构下,路径的区别 仅在前端 处理,通过代理配置决定将不同的请求路径 (/api
和 /api2
) 转发到不同的后端服务。
具体解释:
- 前端的区别:
- 前端使用
axios.get('/api/YOUR_query')
时,这个请求会被代理到第一个后端 (localhost:5000
)。 - 前端使用
axios.get('/api2/YOUR2_data')
时,这个请求会被代理到第二个后端 (localhost:5001
)。
- 前端使用
- 后端的统一处理:
- 第一个后端处理的路由是
/api/YOUR_query
,如平常那样。 - 第二个后端虽然前端请求的路径是
/api2/YOUR2_data
,但代理会把/api2
前缀去掉并重写为/api
,所以你只需要在第二个后端处理/api/YOUR2_data
路由。
- 第一个后端处理的路由是
优势:
- 你不需要在后端显式处理
/api2
前缀,所有的路由定义保持一致,减少代码重复和复杂度。 - 前端通过代理灵活地将请求转发到不同的后端,而后端专注于处理实际的业务逻辑,不需要知道具体的前端请求细节。
这样配置后,后端代码可以完全不关心请求来源,前端通过代理机制处理不同路径的转发。
这种设计确保了影响最小,能够顺利地引入新的后端服务而不破坏现有的代码结构。
具体影响:
- 后端代码:
- 你现有的后端代码不需要做任何改动,依然保持原来的路由和逻辑。
- 新的后端代码只需定义新的路由,并保持一致的路径结构,使用
/api/YOUR2_data
等。
- 前端代码:
- 你现有的前端代码使用的 API 请求仍然可以正常工作,如
axios.get('/api/YOUR_query')
。 - 新增的请求可以使用
axios.get('/api2/YOUR2_data')
,通过代理转发到第二个后端服务。
- 你现有的前端代码使用的 API 请求仍然可以正常工作,如
整体架构:
- 请求流向:
axios.get('/api/YOUR_query')
→localhost:5000/api/YOUR_query
(第一个后端处理)axios.get('/api2/YOUR2_data')
→localhost:5001/api/YOUR2_data
(第二个后端处理)
优势:
- 易于扩展:你可以继续添加更多的后端服务,而不需要在前端或现有后端中进行复杂的修改。
- 维护简便:后端只需关注业务逻辑,而不必考虑请求是从哪个前端路径来的,保持了清晰的职责分离。
这样我每天在启动项目的时候就需要多打开一个终端,在终端写一行新代码,运行:
waitress-serve --port=5001 second_pythonfile:app
当然,你也可以自己写一个脚本来同时启动这些后端服务,这个问题就留给大家了。
你现在可以独立修改和测试第二个后端代码,且不会影响到第一个后端的运行和数据获取。这种架构带来了很多灵活性,具体来说:
优势:
- 独立开发:
- 你可以在
localhost:5001
上自由修改和测试第二个后端代码,确保功能正常,而不会对运行在localhost:5000
的第一个后端服务产生任何干扰。
- 你可以在
- 并行测试:
- 你可以同时进行两个服务的测试。例如,在一个终端上调用第一个后端的 API,确认数据是否正确,然后在另一个终端上测试第二个后端的 API,这种并行性大大提高了开发效率。
- 灵活性:
- 你可以根据需求不断地修改、重启第二个后端,而不需要担心打断到其他服务的正常运行。这让你在进行实验或调试时更加灵活。
注意事项:
- 确保端口正确:
- 启动和测试时,请确保你清楚每个服务运行的端口,以避免混淆。
- API 版本管理:
- 如果你打算将第二个后端服务部署到生产环境中,可以考虑对 API 进行版本管理,以便更好地管理不同版本的服务。
这种架构大大提高了代码的可维护性和可扩展性,使你能够在开发和测试阶段更轻松地管理不同的服务和功能。
标签:服务,请求,api2,Flask,模块化,代码,api,开发方式,前端 From: https://blog.csdn.net/WXR1747636339/article/details/143034043