实现FastAPI + Vue一体化部署(跳过HTTP代理服务器),并使用PyInstaller打包。
FastAPI + Vue一体化部署
使用Fast API后端可以代替HTTP服务器(如Nignx)托管前端Vue dist包,这样前端页面和后台接口就在同一个地址和端口上,既解决了跨域问题,也方便一体化部署。
项目目录结构如下,
my-app/
├── app
│ ├─ _init_.py
│ └─ …
│
├── dist/
│ ├── assets
│ ├── resource
│ ├── index.html
│ └── …
├── vite.config.js
├── run.py
├── config.yml
└── …
首先修改vite.config.js文件,
1 | ... |
然后修改app下的__init__.py文件,
1 | # 获取当前文件所在目录 (app 目录) |
可将上述修改进一步优化,引入config.yml配置文件,对开发环境与打包环境作区分:
1 | # 运行环境配置 |
app下的__init__.py文件对应代码修改为:
1 | import os |
若app中存在审计中间件,对于特定路径需要跳过审计。
1 | # 定义需要跳过审计的路径前缀 |
PyInstaller
PyInstaller是一个将Python程序打包成独立可执行文件的工具,让你的程序能在没有Python环境的电脑上直接运行。它通过分析你的代码,将Python解释器、依赖库和脚本代码打包在一起,生成一个可执行文件或文件夹。
简单打包(以FastAPI应用为例)
对于一个最简单的FastAPI应用,如main.py:
1 | # main.py |
使用命令pyinstaller main.py --nocofirm即可完成打包,打包结果会生成在dist目录内(单独的exe文件)。
上述命令默认使用--onedir单目录打包方式,也可以使用--onefile单文件打包方式。
进阶打包(指定spec文件)
.spec文件是PyInstaller的核心配置文件,它用Python语法定义了打包的全部规则,相当于一个可编程的打包说明书。当你有复杂需求(如添加资源文件、处理动态导入)时,直接修改这个文件会比在命令行输入一长串参数要清晰、可控得多。
一个标准的 .spec 文件主要由以下几个部分构成,它们共同协作完成打包:
- Analysis:这是最核心的分析与配置阶段。它会扫描主脚本,分析所有的依赖项,并允许你自定义需要包含的二进制文件(binaries)、数据文件(datas)、隐藏导入(hiddenimports)以及需要排除的模块(excludes)。
- PYZ:一个压缩包,将Analysis阶段收集到的所有Python字节码文件打包进去,以减少磁盘占用。
- EXE:定义最终生成的.exe可执行文件的配置,比如输出文件名、图标(icon)、是否显示控制台(console)以及是否启用UPX压缩(upx)等。
- COLLECT:只有在单文件夹模式(默认模式)下才会使用。它的作用是把EXE和Analysis阶段收集到的所有依赖文件(.dll、.pyd、数据文件等)复制到最终的输出文件夹dist里。
1 | # -*- mode: python ; coding: utf-8 -*- |
使用命令pyinstaller main.spec --noconfirm即可通过spec文件完成打包。
此外,通过添加--distpath参数可以更改默认的dist目录为指定目录, 例如pyinstaller main.spec --distpath .\your-pyinstaller-dist --noconfirm。
注: 通过显示指定添加的py文件夹(如’app/algorithm/libs’),源码可能未被加密。
可使用加密工具pyarmor对整个目录的py文件进行加密,使用命令pyarmor gen -r -O ./your-pyarmor-dist app即可输出加密文件到指定目录。
其中生成的pyarmor_runtime_*文件夹是运行加密代码所必需的,不能删除。需要手动将它移动到与入口脚本相同的目录下(示例为app目录下)。