在 OpenWrt 上部署 Flask 应用的详细步骤,包括环境配置、数据库集成及开机自启设置教程

devtools/2024/9/25 8:24:38/

引言

OpenWrt 是一个基于 Linux 的嵌入式操作系统,广泛应用于路由器和其他网络设备。Flask 是一个轻量级的 Python Web 框架,以其简单易用和灵活性而受到开发者的青睐。本教程将指导你如何在 OpenWrt 系统上安装和配置 Flask 框架,开发一个简单的 Web 应用,并将其部署到 OpenWrt 上。

OpenWrt__5">OpenWrt 简介

OpenWrt 是一个开源项目,旨在提供一个可高度定制的 Linux 发行版,主要用于路由器。它允许用户完全控制路由器的操作系统,支持各种网络协议和服务。OpenWrt 的主要特点包括:

  • 灵活性:用户可以根据需要安装和配置软件包。

  • 稳定性:相较于厂商固件,OpenWrt 提供更好的稳定性和安全性。

  • 社区支持:OpenWrt 拥有一个活跃的社区,提供丰富的文档和支持。

Flask 简介

Flask 是一个使用 Python 编写的微框架,适合快速构建 Web 应用程序。它的设计理念是简单和灵活,允许开发者自由选择所需的组件。Flask 的主要特点包括:

  • 轻量级:Flask 核心非常小,功能可以通过扩展进行添加。

  • 可扩展性:可以轻松集成数据库、表单处理等功能。

  • 易于使用:简洁的 API 使得开发变得容易。

开发环境准备

在开始之前,需要确保你的 OpenWrt 路由器已正确安装并可以访问。

OpenWrt__34">OpenWrt 安装和配置

  1. 下载 OpenWrt 固件:

    • 访问 OpenWrt 官方网站 下载适合你设备的固件。
  2. 刷入 OpenWrt

    • 根据设备型号,使用合适的方式刷入固件(如通过 Web 界面或 TFTP)。
  3. 配置网络:

    ssh root@192.168.1.1
    
  • 通过 SSH 登录到路由器,默认 IP 通常是 192.168.1.1
  1. 设置管理员密码:

    passwd
    
  • 第一次登录后,设置密码以提高安全性。

安装 Flask 和其依赖

  1. 更新包管理器:

    opkg update
    
  2. 安装 Python 和 Flask:

    opkg install python3 python3-flask python3-pip
    
    • 安装 Python 3 和 Flask 相关的依赖。
  3. 安装其他可能需要的依赖:

    opkg install python3-sqlite3
    
    • 根据应用需求,可能还需要其他库,如数据库驱动(例如 SQLite)。

创建第一个 Flask 应用

  1. 创建应用目录:

    mkdir /root/flask\_appcd /root/flask\_app
    
  2. 创建 Flask 应用文件:
    使用文本编辑器(如 vinano)创建一个名为 app.py 的文件,并写入以下代码:

    from flask import Flaskapp = Flask(__name__)@app.route('/')
    def home():return "Hello, OpenWrt!"if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
    

    这段代码创建了一个简单的 Flask 应用,定义了一个根路由 /,当访问该路由时,会返回 “Hello, OpenWrt!”。

  3. 运行 Flask 应用:
    在终端中,运行以下命令启动 Flask 应用:

    python3 app.py
    

    你应该会看到类似以下的输出,表示 Flask 应用正在运行:

    * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
    
  4. 访问 Flask 应用:
    在浏览器中输入你的路由器 IP 地址和端口号(例如 http://192.168.1.1:5000),你应该能看到页面上显示 “Hello, OpenWrt!”。

Flask 应用的开发

路由和视图

Flask 通过路由将 URL 映射到 Python 函数。你可以定义多个路由来处理不同的请求。

  1. 添加新的路由:
    app.py 中添加更多的路由和视图函数:

    @app.route('/about')
    def about():
    return "This is an about page."@app.route('/greet/<name>')
    def greet(name):return f"Hello, {name}!"
    
    • /about 路由返回关于页面的简单文本。

    • /greet/<name> 路由使用 URL 参数 name 来生成个性化的问候。

  2. 重新启动 Flask 应用,并访问新定义的路由:

    • 访问 http://192.168.1.1:5000/about,你应该能看到 “This is an about page.”

    • 访问 http://192.168.1.1:5000/greet/YourName,替换 YourName 为你自己的名字,应该能看到个性化问候。

模板渲染

Flask 支持使用 Jinja2 模板引擎来渲染 HTML 页面。创建一个模板目录,并使用 HTML 文件来动态生成内容。

  1. 创建模板目录:
    flask_app 目录下创建一个名为 templates 的文件夹:

    mkdir templates
    
  2. 创建 HTML 模板:
    templates 目录中创建一个名为 index.html 的文件,内容如下:

    <!doctype html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask on OpenWrt</title>
    </head>
    <body><h1>Hello, OpenWrt!</h1><p>Welcome to your Flask app running on OpenWrt.</p>
    </body>
    </html>
    
  3. 在 Flask 应用中渲染模板:
    修改 app.py 以使用模板渲染:

    from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
    def home():return render_template('index.html')
    

处理表单

Flask 提供了处理 HTTP 表单数据的功能。接下来,我们将创建一个简单的表单,以接受用户输入。

  1. 修改 HTML 模板:
    修改 index.html 添加一个表单:

    <!doctype html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask on OpenWrt</title>
    </head>
    <body><h1>Hello, OpenWrt!</h1><p>Welcome to your Flask app running on OpenWrt.</p><form action="/greet" method="post"><label for="name">Enter your name:</label><input type="text" id="name" name="name" required><input type="submit" value="Greet Me"></form>
    </body>
    </html>
    
    • 这个表单包含一个文本输入框和一个提交按钮。用户输入名字后,表单数据将通过 POST 请求发送到 /greet 路由。
  2. 修改 app.py 以处理表单数据:
    app.py 中添加处理 POST 请求的路由:

    from flask import Flask, render_template, requestapp = Flask(__name__)@app.route('/')
    def home():return render_template('index.html')@app.route('/greet', methods=['POST'])
    def greet():name = request.form.get('name')return f"Hello, {name}!"
    
    • /greet 路由现在可以处理 POST 请求,并从表单中获取 name 字段的值。
  3. 重新启动 Flask 应用,并访问 http://192.168.1.1:5000。输入你的名字并提交表单,你应该能看到个性化的问候。

使用数据库

接下来,我们将介绍如何在 Flask 应用中使用 SQLite 数据库来存储和检索数据。

  1. 安装 SQLite 库:
    如果之前没有安装 SQLite,你可以通过以下命令安装:
    opkg install python3-sqlite3
    
  2. 创建数据库和表:
    flask_app 目录中创建一个 Python 文件 db.py,用于数据库的初始化和操作:
import sqlite3def init_db():conn = sqlite3.connect('app.db')cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)''')conn.commit()conn.close()def add_user(name):conn = sqlite3.connect('app.db')cursor = conn.cursor()cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))conn.commit()conn.close()def get_all_users():conn = sqlite3.connect('app.db')cursor = conn.cursor()cursor.execute('SELECT name FROM users')users = cursor.fetchall()conn.close()return users
  • init_db 函数用于创建数据库users 表。

  • add_user 函数用于向表中插入新用户。

  • get_all_users 函数用于检索所有用户。

  1. 初始化数据库
    在 Flask 应用启动时调用 init_db(),确保数据库和表被创建。在 app.py 文件的开头添加以下代码:

    from db import init_db, add_user, get_all_usersinit_db()
    
  2. 更新 /greet 路由以存储用户数据:
    现在我们将用户的名字存储在数据库中,并提供查看已存储用户的功能。更新 app.py 如下:

  3. 重新启动 Flask 应用,并访问:

    • 访问 http://192.168.1.1:5000,输入你的名字并提交表单,Flask 应用将会将你的名字存入 SQLite 数据库

    • 访问 http://192.168.1.1:5000/users,你应该能看到所有已存储的用户列表。

整体代码

到现在为止,我们的 Flask 应用已经包含了基本的路由、表单处理和数据库交互功能。以下是完整的 app.pydb.py 文件代码。

app.py
from flask import Flask, render_template, request
from db import init_db, add_user, get_all_usersapp = Flask(__name__)# 初始化数据库
init_db()@app.route('/')
def home():return render_template('index.html')@app.route('/greet', methods=['POST'])
def greet():name = request.form.get('name')add_user(name)  # 将用户添加到数据库return f"Hello, {name}! Your name has been stored."@app.route('/users')
def users():user_list = get_all_users()return '<br>'.join([user[0] for user in user_list]) if user_list else "No users found."if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
db.py
import sqlite3def init_db():conn = sqlite3.connect('app.db')cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)''')conn.commit()conn.close()def add_user(name):conn = sqlite3.connect('app.db')cursor = conn.cursor()cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))conn.commit()conn.close()def get_all_users():conn = sqlite3.connect('app.db')cursor = conn.cursor()cursor.execute('SELECT name FROM users')users = cursor.fetchall()conn.close()return users
templates/index.html
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask on OpenWrt</title>
</head>
<body><h1>Hello, OpenWrt!</h1><p>Welcome to your Flask app running on OpenWrt.</p><form action="/greet" method="post"><label for="name">Enter your name:</label><input type="text" id="name" name="name" required><input type="submit" value="Greet Me"></form><h2>Users List</h2><a href="/users">View All Users</a>
</body>
</html>

Flask 应用的部署

接下来,我们将讨论如何将 Flask 应用部署到 OpenWrt 系统中,使其在后台运行,并在系统重启时自动启动。

使用 uHTTPd 部署 Flask 应用

uHTTPdOpenWrt 上一个轻量级的 HTTP 服务器,它可以与 Flask 应用结合使用。

1. 安装 uHTTPd

如果还没有安装 uHTTPd,可以使用以下命令进行安装:

opkg install uhttpd
2. 配置 uHTTPd

修改 uHTTPd 的配置文件,使其能够处理 Flask 应用。打开配置文件 /etc/config/uhttpd,并进行以下更改:

config uhttpd mainlist listen_http '0.0.0.0:80'option script_timeout '60'option network 'lan'option document_root '/www'option rfc1918_filter '1'option max_connections '100'
3. 创建 uHTTPd 的 CGI 配置

你可以将 Flask 应用作为 CGI 脚本运行,也可以使用 WSGI 进行更高级的配置。这里我们将使用 CGI 方式。

将 Flask 应用的启动命令写入一个脚本文件。创建一个名为 start_flask.sh 的文件,内容如下:

#!/bin/sh
# 启动 Flask 应用
cd /root/flask_app
python3 app.py

确保 start_flask.sh 脚本可执行,并设置合适的权限:

chmod +x /root/flask\_app/start\_flask.sh
4. 配置 uHTTPd 以使用 CGI

/etc/config/uhttpd 文件中,添加 CGI 配置,指向你的 Flask 应用脚本:

config uhttpd 'main'list listen_http '0.0.0.0:80'option script_timeout '60'option network 'lan'option document_root '/www'option rfc1918_filter '1'option max_connections '100'option cgi_prefix '/cgi-bin'list cgi\_prefix '/cgi-bin/start\_flask.sh'  # 添加这一行
5. 重启 uHTTPd

在修改完配置后,重启 uHTTPd 以使更改生效:

/etc/init.d/uhttpd restart
6. 访问 Flask 应用

现在,你可以通过访问路由器的 IP 地址来查看 Flask 应用。打开浏览器并输入:

http://<你的路由器IP>

设置开机自启

为了使 Flask 应用在 OpenWrt 启动时自动运行,我们可以将启动脚本添加到系统启动项中。

1. 创建 init 脚本

/etc/init.d/ 目录下创建一个名为 flask_app 的脚本,内容如下:

#!/bin/sh /etc/rc.common
# Flask 应用启动脚本START=99
STOP=99start() {echo "Starting Flask app..."/bin/sh /root/flask_app/start_flask.sh &
}stop() {echo "Stopping Flask app..."killall python3  # 停止 Flask 应用
}
2. 设置脚本权限

确保脚本可执行:

chmod +x /etc/init.d/flask_app
3. 添加到启动项

将 Flask 应用添加到启动项:

/etc/init.d/flask_app enable
4. 重启路由器以测试

重启路由器:

reboot

重启后,检查 Flask 应用是否正在运行。可以再次访问 http://<你的路由器IP> 来确认。

总结

本教程展示了如何在 OpenWrt 系统上安装和配置 Flask 框架,创建一个简单的 Web 应用,并将其部署到 OpenWrt 上。通过以下步骤,你应该能够在 OpenWrt 上成功运行 Flask 应用:

  1. 安装 OpenWrt:确保路由器上安装了 OpenWrt 固件。

  2. 安装 Flask 和依赖:通过 opkg 安装 Python 和 Flask。

  3. 创建 Flask 应用:编写简单的 Flask 应用,处理路由、表单和数据库

  4. 使用 uHTTPd 部署 Flask 应用:配置 uHTTPd 以运行 Flask 应用。

  5. 设置开机自启:确保 Flask 应用在路由器重启后自动运行。

通过这些步骤,你可以将 Flask 应用与 OpenWrt 系统集成,打造一个灵活的嵌入式 Web 服务。


http://www.ppmy.cn/devtools/102639.html

相关文章

Kubernetes设计架构

目录 1. 集群&#xff08;Cluster&#xff09; 2. 主节点&#xff08;Master Node&#xff09; 3. 工作节点&#xff08;Worker Node&#xff09; 4. Pod 5. 服务&#xff08;Service&#xff09; 6. 命名空间&#xff08;Namespace&#xff09; 7. 配置管理 8. 持久化…

Java 使用ListUtils对List分页处理

背景分析 工作中&#xff0c;经常遇到需要用Java进行分页处理数据&#xff0c;例如把1000万条Excel数据写入MySQL数据库&#xff0c;如果把这1000w数据一股脑的丢给MySQL&#xff0c;保证把数据库玩完&#xff0c;故需要批量写入&#xff0c;如每批次写入500条。这时候就可以使…

内网安全:跨域攻击

目录 获取域信息 利用域信任密钥获取目标域 利用krbtgt哈希值获取目标域 内网中的域林&#xff1a; 很多大型企业都拥有自己的内网&#xff0c;一般通过域林进行共享资源。根据不同职能区分的部门&#xff0c;从逻辑上以 主域和子域进行区分&#xff0c;以方便统一管理。在…

斯坦福大学cs231n (图像分类)

1.介绍 当作图像分类时&#xff0c;分类系统接收一些分类图像&#xff0c;比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么&#xff0c;计算机的工作就是根据图片&#xff0c;给他分配一些固定的分类或者标签。 对于一个计算机来说&#xff0c;这是一个非常…

uniapp的uploadFile在APP端上传视频失败

问题 使用uniapp开发APP&#xff0c;在使用上传接口时&#xff0c;出现了后台提示没有上传文件&#xff0c;但H5正常 原因 uni.uploadFile({url: url,filePath: path,name: file,// APP必须要写&#xff0c;H5可以不写success: (res) > {} });原因就是name属性必须填写&a…

如祺出行发布首份中期业绩,总收入增长13.6%

8月28日&#xff0c;如祺出行发布2024年中期业绩公告。这是如祺出行于7月10日在港交所主板上市后发布的首份业绩公告。 业绩公告显示&#xff0c;2024年上半年如祺出行收入实现10.37亿元&#xff08;单位&#xff1a;人民币&#xff0c;下同&#xff09;、同比增长13.6%&#x…

代码随想录算法训练营第13天 |二叉树的学习

目录 二叉树 理论基础 二叉树的分类 1. 满二叉树 (Full Binary Tree) 2. 完全二叉树 (Complete Binary Tree) 3. 平衡二叉树 (Balanced Binary Tree) 5. 二叉搜索树 (Binary Search Tree, BST) 二叉树的存储 1. 链式存储 (Linked Representation) 2. 顺序存储 (Sequent…

Qt/QML学习-MenuBarToolBar

QML学习 MenuBar&ToolBar例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("MenuBar&ToolBar")// 菜单栏MenuBar {id: menuBarcontentWid…