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

引言

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

OpenWrt 简介

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

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

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

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

Flask 简介

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

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

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

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

开发环境准备

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

OpenWrt 安装和配置

  1. 下载 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 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!”。

  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_template
    
    app = 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, 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 字段的值。
  3. 重新启动 Flask 应用,并访问 http://192.168.1.1:5000。输入你的名字并提交表单,你应该能看到个性化的问候。

使用数据库

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

  1. 安装 SQLite 库:
    如果之前没有安装 SQLite,你可以通过以下命令安装:
    opkg install python3-sqlite3
    
  2. 创建数据库和表:
    flask_app 目录中创建一个 Python 文件 db.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 函数用于检索所有用户。

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

    from db import init_db, add_user, get_all_users
    
    init_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_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
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
<!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,可以使用以下命令进行安装:

opkg install uhttpd
2. 配置 uHTTPd

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

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 的文件,内容如下:

#!/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=99

start() {
    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 服务。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值