0 前言

我用python写了一个后端服务,用来处理前端计算短波通信选频的请求。本地测试很简单,不要考虑并发的问题,报错也直接终止就行了。但部署到服务器时,就需要考虑代码的稳定性了。

1 后端服务

  • 安装Flask库
sudo apt install python3-flask
  • 使用python中的Flask库实现后端监听功能,创建一个app.py文件,写入如下代码
from flask import Flask, request, jsonify

# 初始化 Flask 应用
app = Flask(__name__)

# 处理 POST 请求(JSON 数据)
@app.route('/json', methods=['POST'])
def handle_json_post():
    # 获取 JSON 数据(需客户端设置 Content-Type: application/json)
    json_data = request.get_json()  # 自动解析 JSON
    if not json_data:
        return jsonify({"error": "无效的 JSON 数据"}), 400
    print("收到 POST 请求(JSON 数据)")
    print("JSON 数据:", json_data)
    return jsonify({"message": "已接收 JSON 数据", "json_data": json_data})

# 运行应用(监听 8000 端口)
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8000, debug=True)
  • 这段代码的含义是当地址http://127.0.0.1:8000/json接收到post请求时,会打印接收的请求数据并返回给前端

  • 为了防止跨域的问题,可以使用nginx127.0.0.1:8000进行反向代理,具体操作可查阅其他博客

  • 本地测试时,使用如下代码启动后端服务即可

python3 app.py
  • 启动服务后,可在终端中运行如下代码测试后端服务是否启动成功
curl -X POST -H "Content-Type: application/json" -d '{"title":"Test","content":"Hello Flask"}' http://127.0.0.1:8000/json
  • 正常启动会打印发送的Json数据

2 ubuntu启动后端服务

  • 使用Gunicorn作为WSGI服务器,安装Gunicorn
sudo apt install gunicorn
  • 启动测试
gunicorn -w 4 -b 127.0.0.1:8000 --access-logfile - --error-logfile - app:app
  • -w 4:4个worker进程(推荐为CPU核心数×2+1)。
  • -b 127.0.0.1:8000:绑定本地8000端口(避免直接暴露公网)。
  • --access-logfile -:访问日志输出到标准输出。
  • --error-logfile -:错误日志输出到标准输出。
  • app:app:指向Flask应用实例(app.py中的app对象)。
  • 通过Systemd创建服务单元,实现开机启动、自动重启等功能。首先创建服务文件
sudo vim /etc/systemd/system/yourproj.service
  • 写入服务配置
[Unit]
Description=HFCom Frequency Calculation Service
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/xxx/proj
ExecStart=gunicorn -w 4 -b 127.0.0.1:8000 --access-logfile - --error-logfile - app:app
Restart=always

[Install]
WantedBy=multi-user.target
  • User 替换为实际用户名
  • Group 同理
  • WorkingDirectory 后端服务文件所在目录
  • Restart 崩溃后自动重启
  • 重新加载systemd配置
sudo systemctl daemon-reload
  • 启动服务
sudo systemctl start yourproj
  • 开机自启
sudo systemctl enable yourproj
  • 查看实时状态
sudo systemctl status yourproj

后记

最开始在本地使用了uwsgi作为的WSGI服务器,但python自从3.11版本之后,无法使用pip直接安装库到系统环境,只能使用apt进行安装。但apt安装的uwsgi版本较低,很多命令存在不一致的问题。倘若重新创建一个python环境,又会涉及到文件访问权限的问题,即使我给目录下所有文件都增加了755权限,依然无法解决。最终不得不更换为如今的方案,实际使用后发现更加的方便简单。