将开发完成的文件夹拷贝到了新windows服务器上。
1.Python安装 :新服务器上下载python,并安装,安装完成后检查一下
C:\Users\Administrator>python --version
Python 3.14.3
2.安装waitress.
C:\Users\Administrator>python -m pip install waitress
Collecting waitress
Downloading waitress-3.0.2-py3-none-any.whl.metadata (5.8 kB)
Downloading waitress-3.0.2-py3-none-any.whl (56 kB)
Installing collected packages: waitress
Successfully installed waitress-3.0.2
notice\] A new release of pip is available: 25.3 -\> 26.0.1
\[notice\] To update, run: python.exe -m pip install --upgrade pip
其实main.py里面写的是:uvicorn.run(app, host="0.0.0.0", port=5200)。uvicorn本身就是生产级的 ASGI 服务器,比 waitress 更适合 FastAP,所以安装waitress就是多此一举。
**3.配置nssm:** 希望作为服务自启动,不要每次重启服务器都手工启动
下载nssm并解压缩到c:\\
c:\\nssm\\win64\>nssm install MESAPI
将里面的参数配置,按实际情况配置好。
Service "MESAPI" installed successfully!
**4.启动服务器失败**
c:\\nssm\\win64\>nssm start mesapi
MESAPI: Unexpected status SERVICE_STOPPED in response to START control.
但是服务日志中并没有错误,直接运行python.
PS E:\\MESAPI\> python main.py
Traceback (most recent call last):
File "E:\\MESAPI\\main.py", line 1, in \
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:5200 (Press CTRL+C to quit)
启动正常。
关闭后再试一次
C:\Users\Administrator>python e:\mesapi\main.py
←[32mINFO←[0m: Started server process [←[36m8432←[0m]
←[32mINFO←[0m: Waiting for application startup.
←[32mINFO←[0m: Application startup complete.
←[32mINFO←[0m: Uvicorn running on ←[1mhttp://0.0.0.0:5200←[0m (Press CTRL+C to quit)
启动也正常,说明程序本身没有问题,nssm安装的服务无法启动,问题还是在nssm设置问题。
4.用nssm重新设置服务
c:\nssm\win64>nssm remove mesapi confirm --删除
c:\nssm\win64>nssm install MESAPI
这次把nssm要设置的参数都好好检查了一遍
Application Path: C:\Python310\python.exe
Arguments: e:\mesapi\main.py
Startup directory: e:\mesapi\
Details Display name : mesapi
Log on Account: Local System account
I/O Output (stdout) e:\mesapi\logs\stdout.log
Error (stderr) e:\mesapi\logs\stderr.log
设置完成后,启动服务,正常了!看来还是参数设置错误。
5.安装ODBC驱动
但是启动了,却无法访问,提示数据库链接错误。
{
"detail": "Database connection failed"
}
原因是缺少Microsoft ODBC Driver 18 for SQL Server (x64)
去微软网站:https://go.microsoft.com/fwlink/?linkid=2345415,下载安装。
安装后在用postman调用API,返回正确
{
"code": 200,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTc3Mzk3NzI0N30.dBZdCWMmnHoOe3v_larjOM2Dm1MsQ3EiyPIRNMZZ2A8"
},
"msg": "success"
}
6.POSTMAN测试API接口
虽然刚才用postman测试了一个API,但是为了验证,还是再测一下其它API接口
post http://192.168.10.15:5200/system/login
body 设置x-www-form-urlencoded
username:admin
password: adminpassword
post http://192.168.10.15:5200/system/sp/Menu
headers中添加:
authorization: Bearer (login返回的token)
content-Type: application/json
测试第二个接口就遇到新问题:
调用服务API,提示内部错误,但是直接运行python main.py,访问接口正常返回。
去日志stderr中找到了信息:
\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'charmap' codec can't encode characters in position 22-23: character maps to <undefined>
问了通义前问,告诉我原因是print输出中有中文字符,但 Windows 控制台默认编码(cp1252/cp936)无法处理。
在文件最开头添加
import sys
import io
强制标准输出使用 UTF-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
按建议修改后再次启动python main.py测试,遇到:
Errno 10048\] error while attempting to bind on address ('0.0.0.0', 5200): \[winerror 10048\] only one usage of each socket address (protocol/network address/port) is normally permitted 原因是服务状态是pending,端口被占用了。 停止服务,启动正常。 关闭测试,启动nssm安装的服务,再用postman测试API,接口都正常,部署完成。