You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派上Flask生产服务器与主程序并行运行方案咨询

树莓派Flask应用生产部署方案(同网设备可访问)

你的当前方案在开发环境运行没问题,但生产环境需要更稳定的服务管理、性能更强的Web服务器,同时要保证开机自启和异常恢复能力,以下是具体落地步骤:

一、替换Flask内置开发服务器

Flask自带的app.run()仅适用于开发,生产环境必须用WSGI服务器,这里推荐Gunicorn(轻量易配置),先安装:

pip install gunicorn

代码拆分(规范生产结构)

把数据采集逻辑和Web服务拆成两个独立脚本,避免线程耦合:

data_collector.py(数据采集脚本)

import time
import sqlite3
from datetime import datetime
import random as rand

def databaseSetup():
    connSensor = sqlite3.connect('sensorVariables.db')
    cSensor = connSensor.cursor()
    cSensor.execute('''CREATE TABLE IF NOT EXISTS sensorVariables
            (timestamp TEXT, temperature REAL, pressure REAL, humidity REAL)''')
    return connSensor, cSensor

def main():
    connSensor, cSensor = databaseSetup()
    i = 0
    while True:
        print("Still running main worker: ", i)
        temperature = rand.randint(12,25)
        pressure = rand.randint(1020, 1200)
        humidity =  rand.randint(40,80)
        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        cSensor.execute("INSERT INTO sensorVariables VALUES (?, ?, ?, ?)", (timestamp, temperature, pressure, humidity))
        connSensor.commit()
        print("Sensor variables saved")
        i += 1
        time.sleep(5)

if __name__ == '__main__':
    main()

app.py(Flask Web服务)

from flask import Flask
import sqlite3

app = Flask(__name__)

@app.route('/')
def index():
    conn = sqlite3.connect('sensorVariables.db')
    c = conn.cursor()
    c.execute('SELECT temperature, humidity, pressure, timestamp FROM sensorVariables ORDER BY timestamp DESC LIMIT 1')
    latest_data = c.fetchone()
    conn.close()
    if latest_data:
        temperature, humidity, pressure, timestamp = latest_data
        return f'Time: {timestamp}, Temperature: {temperature}, Humidity: {humidity}, Pressure: {pressure}'
    return 'No data available yet'

二、用Gunicorn启动Web服务

在项目目录下执行命令,启动多进程Web服务:

gunicorn -w 2 -b 0.0.0.0:5000 app:app
  • -w 2:启动2个工作进程(根据树莓派核心数调整,比如Pi 4可设为4)
  • -b 0.0.0.0:5000:绑定所有网卡的5000端口,确保同网设备能访问

三、后台托管+开机自启

用systemd管理两个进程,确保它们后台运行、异常崩溃自动重启、开机自动启动。

1. 创建数据采集服务配置

编辑/etc/systemd/system/data-collector.service:

[Unit]
Description=Sensor Data Collector
After=network.target

[Service]
User=pi
WorkingDirectory=/home/pi/你的项目目录路径
ExecStart=/usr/bin/python3 /home/pi/你的项目目录路径/data_collector.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

2. 创建Flask服务配置

编辑/etc/systemd/system/flask-sensor.service:

[Unit]
Description=Flask Sensor Dashboard
After=network.target data-collector.service

[Service]
User=pi
WorkingDirectory=/home/pi/你的项目目录路径
ExecStart=/usr/local/bin/gunicorn -w 2 -b 0.0.0.0:5000 app:app
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

3. 启动并启用服务

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start data-collector.service
sudo systemctl start flask-sensor.service

# 设置开机自启
sudo systemctl enable data-collector.service
sudo systemctl enable flask-sensor.service

四、确保同网设备可访问

  1. 获取树莓派局域网IP:执行hostname -I,得到类似192.168.1.100的地址
  2. 同网设备在浏览器访问http://192.168.1.100:5000即可查看数据
  3. 若访问失败,检查防火墙:树莓派默认无防火墙,若手动开启则放行5000端口:
sudo ufw allow 5000/tcp

五、额外优化建议

  • SQLite连接优化:在Flask中启用连接池,避免每次请求新建连接,可添加check_same_thread=False参数,或使用Flask-SQLAlchemy简化操作
  • 端口简化:若想不用加端口访问,可将Gunicorn绑定80端口(需授权):
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/gunicorn

之后修改服务配置中的-b 0.0.0.0:80即可

内容的提问来源于stack exchange,提问作者Hjalte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:25:27