引言
OpenWrt 是一个基于 Linux 的嵌入式操作系统,广泛应用于路由器和其他网络设备。Flask 是一个轻量级的 Python Web 框架,以其简单易用和灵活性而受到开发者的青睐。本教程将指导你如何在 OpenWrt 系统上安装和配置 Flask 框架,开发一个简单的 Web 应用,并将其部署到 OpenWrt 上。
OpenWrt 简介
OpenWrt 是一个开源项目,旨在提供一个可高度定制的 Linux 发行版,主要用于路由器。它允许用户完全控制路由器的操作系统,支持各种网络协议和服务。OpenWrt 的主要特点包括:
-
灵活性:用户可以根据需要安装和配置软件包。
-
稳定性:相较于厂商固件,OpenWrt 提供更好的稳定性和安全性。
-
社区支持:OpenWrt 拥有一个活跃的社区,提供丰富的文档和支持。
Flask 简介
Flask 是一个使用 Python 编写的微框架,适合快速构建 Web 应用程序。它的设计理念是简单和灵活,允许开发者自由选择所需的组件。Flask 的主要特点包括:
-
轻量级:Flask 核心非常小,功能可以通过扩展进行添加。
-
可扩展性:可以轻松集成数据库、表单处理等功能。
-
易于使用:简洁的 API 使得开发变得容易。
开发环境准备
在开始之前,需要确保你的 OpenWrt 路由器已正确安装并可以访问。
OpenWrt 安装和配置
-
下载 OpenWrt 固件:
- 访问 OpenWrt 官方网站 下载适合你设备的固件。
-
刷入 OpenWrt:
- 根据设备型号,使用合适的方式刷入固件(如通过 Web 界面或 TFTP)。
-
配置网络:
bashssh root@192.168.1.1
- 通过 SSH 登录到路由器,默认 IP 通常是
192.168.1.1
。
-
设置管理员密码:
bashpasswd
- 第一次登录后,设置密码以提高安全性。
安装 Flask 和其依赖
-
更新包管理器:
bashopkg update
-
安装 Python 和 Flask:
ashopkg install python3 python3-flask python3-pip
- 安装 Python 3 和 Flask 相关的依赖。
-
安装其他可能需要的依赖:
bashopkg install python3-sqlite3
- 根据应用需求,可能还需要其他库,如数据库驱动(例如 SQLite)。
创建第一个 Flask 应用
-
创建应用目录:
bashmkdir /root/flask\_appcd /root/flask\_app
-
创建 Flask 应用文件:
使用文本编辑器(如
vi
或nano
)创建一个名为app.py
的文件,并写入以下代码:pyfrom flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, OpenWrt!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
这段代码创建了一个简单的 Flask 应用,定义了一个根路由
/
,当访问该路由时,会返回 "Hello, OpenWrt!"。 -
运行 Flask 应用:
在终端中,运行以下命令启动 Flask 应用:
bashpython3 app.py
你应该会看到类似以下的输出,表示 Flask 应用正在运行:
py* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
-
访问 Flask 应用:
在浏览器中输入你的路由器 IP 地址和端口号(例如
http://192.168.1.1:5000
),你应该能看到页面上显示 "Hello, OpenWrt!"。
Flask 应用的开发
路由和视图
Flask 通过路由将 URL 映射到 Python 函数。你可以定义多个路由来处理不同的请求。
-
添加新的路由:
在
app.py
中添加更多的路由和视图函数: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
来生成个性化的问候。
-
-
重新启动 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 文件来动态生成内容。
-
创建模板目录:
在
flask_app
目录下创建一个名为templates
的文件夹:bashmkdir templates
-
创建 HTML 模板:
在
templates
目录中创建一个名为index.html
的文件,内容如下: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>
-
在 Flask 应用中渲染模板:
修改
app.py
以使用模板渲染:pyfrom flask import Flask, render_template app = Flask(__name__) @app.route('/') def home(): return render_template('index.html')
处理表单
Flask 提供了处理 HTTP 表单数据的功能。接下来,我们将创建一个简单的表单,以接受用户输入。
-
修改 HTML 模板:
修改
index.html
添加一个表单: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
路由。
- 这个表单包含一个文本输入框和一个提交按钮。用户输入名字后,表单数据将通过 POST 请求发送到
-
修改
app.py
以处理表单数据:在
app.py
中添加处理 POST 请求的路由:pyfrom flask import Flask, render_template, request app = 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
字段的值。
-
重新启动 Flask 应用,并访问
http://192.168.1.1:5000
。输入你的名字并提交表单,你应该能看到个性化的问候。
使用数据库
接下来,我们将介绍如何在 Flask 应用中使用 SQLite 数据库来存储和检索数据。
-
安装 SQLite 库:
如果之前没有安装 SQLite,你可以通过以下命令安装:bashopkg install python3-sqlite3
-
创建数据库和表:
在flask_app
目录中创建一个 Python 文件db.py
,用于数据库的初始化和操作:
py
import sqlite3
def 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
函数用于检索所有用户。
-
初始化数据库:
在 Flask 应用启动时调用
init_db()
,确保数据库和表被创建。在app.py
文件的开头添加以下代码:pyfrom db import init_db, add_user, get_all_users init_db()
-
更新
/greet
路由以存储用户数据:现在我们将用户的名字存储在数据库中,并提供查看已存储用户的功能。更新
app.py
如下: -
重新启动 Flask 应用,并访问:
-
访问
http://192.168.1.1:5000
,输入你的名字并提交表单,Flask 应用将会将你的名字存入 SQLite 数据库。 -
访问
http://192.168.1.1:5000/users
,你应该能看到所有已存储的用户列表。
-
整体代码
到现在为止,我们的 Flask 应用已经包含了基本的路由、表单处理和数据库交互功能。以下是完整的 app.py
和 db.py
文件代码。
app.py
py
from flask import Flask, render_template, request
from db import init_db, add_user, get_all_users
app = 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
py
import sqlite3
def 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
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 应用
uHTTPd
是 OpenWrt 上一个轻量级的 HTTP 服务器,它可以与 Flask 应用结合使用。
1. 安装 uHTTPd
如果还没有安装 uHTTPd
,可以使用以下命令进行安装:
bash
opkg install uhttpd
2. 配置 uHTTPd
修改 uHTTPd
的配置文件,使其能够处理 Flask 应用。打开配置文件 /etc/config/uhttpd
,并进行以下更改:
bash
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'
3. 创建 uHTTPd 的 CGI 配置
你可以将 Flask 应用作为 CGI 脚本运行,也可以使用 WSGI 进行更高级的配置。这里我们将使用 CGI 方式。
将 Flask 应用的启动命令写入一个脚本文件。创建一个名为 start_flask.sh
的文件,内容如下:
py
#!/bin/sh
# 启动 Flask 应用
cd /root/flask_app
python3 app.py
确保 start_flask.sh
脚本可执行,并设置合适的权限:
bash
chmod +x /root/flask\_app/start\_flask.sh
4. 配置 uHTTPd 以使用 CGI
在 /etc/config/uhttpd
文件中,添加 CGI 配置,指向你的 Flask 应用脚本:
bash
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
以使更改生效:
bash
/etc/init.d/uhttpd restart
6. 访问 Flask 应用
现在,你可以通过访问路由器的 IP 地址来查看 Flask 应用。打开浏览器并输入:
bash
http://<你的路由器IP>
设置开机自启
为了使 Flask 应用在 OpenWrt 启动时自动运行,我们可以将启动脚本添加到系统启动项中。
1. 创建 init 脚本
在 /etc/init.d/
目录下创建一个名为 flask_app
的脚本,内容如下:
py
#!/bin/sh /etc/rc.common
# Flask 应用启动脚本
START=99
STOP=99
start() {
echo "Starting Flask app..."
/bin/sh /root/flask_app/start_flask.sh &
}
stop() {
echo "Stopping Flask app..."
killall python3 # 停止 Flask 应用
}
2. 设置脚本权限
确保脚本可执行:
bash
chmod +x /etc/init.d/flask_app
3. 添加到启动项
将 Flask 应用添加到启动项:
bash
/etc/init.d/flask_app enable
4. 重启路由器以测试
重启路由器:
bash
reboot
重启后,检查 Flask 应用是否正在运行。可以再次访问 http://<你的路由器IP>
来确认。
总结
本教程展示了如何在 OpenWrt 系统上安装和配置 Flask 框架,创建一个简单的 Web 应用,并将其部署到 OpenWrt 上。通过以下步骤,你应该能够在 OpenWrt 上成功运行 Flask 应用:
-
安装 OpenWrt:确保路由器上安装了 OpenWrt 固件。
-
安装 Flask 和依赖:通过
opkg
安装 Python 和 Flask。 -
创建 Flask 应用:编写简单的 Flask 应用,处理路由、表单和数据库。
-
使用 uHTTPd 部署 Flask 应用:配置
uHTTPd
以运行 Flask 应用。 -
设置开机自启:确保 Flask 应用在路由器重启后自动运行。
通过这些步骤,你可以将 Flask 应用与 OpenWrt 系统集成,打造一个灵活的嵌入式 Web 服务。