樹莓派NAS系統(tǒng)搭建教程:使用Flask和SQLite實現(xiàn)HTTP/HTTPS文件管理(代碼示例)

一、項目概述

隨著物聯(lián)網(wǎng)(IoT)技術(shù)的發(fā)展,數(shù)據(jù)存儲和共享需求日益增長。本文將介紹如何利用樹莓派(Raspberry Pi)搭建一個網(wǎng)絡附加存儲(NAS)系統(tǒng),以實現(xiàn)數(shù)據(jù)的集中管理、共享和訪問。該系統(tǒng)具備可視化界面和訪問管理功能,用戶可以通過Web界面方便地管理文件,實現(xiàn)跨設(shè)備訪問,適合家庭或小型辦公室使用。

二、系統(tǒng)架構(gòu)

1. 硬件選擇

  • 單片機:樹莓派4 Model B

  • 存儲設(shè)備:外接USB硬盤或SD卡

  • 網(wǎng)絡設(shè)備:支持Wi-Fi或有線網(wǎng)絡的路由器

2. 軟件技術(shù)棧

  • 操作系統(tǒng):Raspberry Pi OS(基于Debian)

  • 文件共享協(xié)議:Samba(用于文件共享)

  • 后端框架:Flask(Python Web框架)

  • 前端技術(shù):HTML、CSS、JavaScript(用于構(gòu)建可視化界面)

  • 數(shù)據(jù)庫:SQLite(用于管理用戶信息和訪問記錄)

三、環(huán)境搭建

1. 準備環(huán)境

首先需要將Raspberry Pi OS安裝到樹莓派中??梢酝ㄟ^官方的樹莓派 Imager工具將操作系統(tǒng)寫入SD卡。

2. 安裝必要的軟件包

通過SSH或直接在樹莓派終端中執(zhí)行以下命令:

\# 更新軟件包列表

sudo apt update
sudo apt upgrade -y

\# 安裝Samba

sudo apt install samba samba-common-bin -y

\# 安裝Flask及其依賴

sudo apt install python3-flask python3-sqlite3 -y

3. 配置Samba

編輯Samba配置文件以共享文件夾:

sudo nano /etc/samba/smb.conf

在文件末尾添加以下內(nèi)容:

\[PiNAS\]
   path = /home/pi/nas
   available = yes
   valid users = pi
   read only = no
   browsable = yes
   public = yes
   writable = yes

創(chuàng)建共享文件夾并設(shè)置權(quán)限:

mkdir /home/pi/nassudo chown -R pi:pi /home/pi/nas

重啟Samba服務:

sudo systemctl restart smbd

四、代碼實現(xiàn)

1. 創(chuàng)建Flask應用

創(chuàng)建一個新的目錄用于存放Flask項目:

mkdir ~/flask\_nascd ~/flask\_nas

在該目錄下創(chuàng)建app.py文件:

from flask import Flask, render_template, request, redirect, url_for
import os
import sqlite3

app = Flask(__name__)

DATABASE = 'nas.db'

def get_db():
    conn = sqlite3.connect(DATABASE)
    return conn

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return redirect(request.url)
    file = request.files['file']
    if file.filename == '':
        return redirect(request.url)
    
    # 保存文件到共享文件夾
    file.save(os.path.join('/home/pi/nas', file.filename))
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

代碼說明:

  • 導入模塊:引入Flask框架及其相關(guān)模塊,以及用于操作文件和數(shù)據(jù)庫的os和sqlite3模塊。

  • 創(chuàng)建Flask應用:實例化Flask應用。

  • 數(shù)據(jù)庫連接函數(shù):get_db()函數(shù)用于連接SQLite數(shù)據(jù)庫。

  • 首頁路由:訪問根地址時返回index.html模板。

  • 文件上傳路由:處理文件上傳的POST請求。檢查上傳的文件是否存在,如果文件名為空則重定向回首頁。如果文件存在,將其保存到指定的共享文件夾。

  • 運行應用:通過app.run()啟動Flask應用,讓它在所有可用的網(wǎng)絡接口上運行(0.0.0.0),并監(jiān)聽5000端口。

2. 創(chuàng)建前端頁面

flask_nas目錄下,創(chuàng)建templates文件夾,并在其中創(chuàng)建index.html文件:

mkdir templates
cd templates
nano index.html

index.html中輸入以下內(nèi)容:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>樹莓派 NAS 文件上傳</title>
</head>
<body>
    <h1>樹莓派 NAS 文件上傳</h1>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" required>
        <input type="submit" value="上傳">
    </form>
</body>
</html>

代碼說明:

  • HTML結(jié)構(gòu):使用標準的HTML5文檔結(jié)構(gòu)。

  • 表單:創(chuàng)建一個表單用于文件上傳。action屬性指向/upload路由,method設(shè)為POST,并使用enctype="multipart/form-data"來支持文件上傳。

  • 文件輸入:<input type="file">用于選擇文件,required屬性確保用戶必須選擇一個文件才能提交表單。

  • 提交按鈕:<input type="submit">用于提交表單。

3. 數(shù)據(jù)庫初始化

為了記錄用戶上傳的文件信息,可以創(chuàng)建一個SQLite數(shù)據(jù)庫,并在app.py中添加數(shù)據(jù)庫初始化邏輯。首先,在flask_nas目錄下創(chuàng)建一個nas.db數(shù)據(jù)庫:

sqlite3 nas.db

在SQLite命令行中輸入以下SQL語句創(chuàng)建一個文件記錄表:

CREATE TABLE files (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    filename TEXT NOT NULL,
    upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

然后在upload_file函數(shù)中,保存文件上傳的記錄:

# 在upload_file函數(shù)中添加以下代碼
conn = get_db()
cursor = conn.cursor()
cursor.execute("INSERT INTO files (filename) VALUES (?)", (file.filename,))
conn.commit()
conn.close()

4. 啟動Flask應用

在終端中運行以下命令以啟動Flask應用:

python3 app.py

在應用啟動后,您可以通過訪問樹莓派的IP地址和5000端口來查看可視化界面。例如,如果樹莓派的IP地址是192.168.1.100,則在瀏覽器中輸入以下地址:

http://192.168.1.100:5000

5. 測試文件上傳功能

  1. 選擇文件:在頁面上點擊"選擇文件"按鈕,選擇要上傳的文件。

  2. 上傳文件:點擊"上傳"按鈕,文件將被上傳到樹莓派的共享文件夾中。

  3. 檢查文件:在終端中,您可以通過以下命令查看上傳的文件:

    ls /home/pi/nas
    

    您應該能夠看到您剛才上傳的文件。

6. 數(shù)據(jù)庫記錄查看

若要查看上傳的文件記錄,可以在Python中查詢數(shù)據(jù)庫。您可以在app.py中添加一個新的路由來顯示已上傳文件的列表。更新代碼如下:

@app.route('/files')
def files():
    conn = get_db()
    cursor = conn.cursor()
    cursor.execute("SELECT filename, upload_time FROM files")
    uploaded_files = cursor.fetchall()
    conn.close()
    return render_template('files.html', files=uploaded_files)

然后在templates文件夾中創(chuàng)建一個新的HTML文件files.html

nano templates/files.html

輸入以下內(nèi)容:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>已上傳文件列表</title>
</head>
<body>
    <h1>已上傳文件列表</h1>
    <table border="1">
        <tr>
            <th>文件名</th>
            <th>上傳時間</th>
        </tr>
        {% for file in files %}
        <tr>
            <td>{{ file[0] }}</td>
            <td>{{ file[1] }}</td>
        </tr>
        {% endfor %}
    </table>
    <a href="/">返回上傳頁面</a>
</body>
</html>

代碼說明:

  • 新路由/files:查詢數(shù)據(jù)庫中的文件記錄,并將結(jié)果傳遞給files.html模板。

  • 文件列表顯示:在files.html中使用HTML表格來顯示已上傳文件的名稱和上傳時間。

  • 返回鏈接:提供一個返回上傳頁面的鏈接。

7. 添加訪問管理功能

為了增強系統(tǒng)的安全性,您可以為文件上傳功能添加基本的用戶身份驗證。我們可以在Flask應用中使用Flask-Login庫來實現(xiàn)這一點。

首先,安裝Flask-Login:

sudo apt install python3-flask-login

然后,在app.py文件中進行以下修改:

from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

# 初始化Flask-Login
login_manager = LoginManager()
login_manager.init_app(app)

# 用戶類
class User(UserMixin):
    def __init__(self, id):
        self.id = id

# 用戶加載回調(diào)
@login_manager.user_loader
def load_user(user_id):
    return User(user_id)

# 登錄路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username == 'admin' and password == 'password':  # 使用簡單的用戶名和密碼
            user = User(username)
            login_user(user)
            return redirect(url_for('index'))
    return render_template('login.html')

# 修改首頁路由,添加登錄驗證
@app.route('/')
@login_required
def index():
    return render_template('index.html')

代碼說明:

  • 用戶類 User:定義一個用戶類,繼承自UserMixin,用于存儲用戶的ID。

  • 用戶加載回調(diào):定義load_user函數(shù),F(xiàn)lask-Login會使用該函數(shù)根據(jù)用戶ID加載用戶對象。

  • 登錄路由:創(chuàng)建一個新的路由/login,處理用戶的登錄請求。若用戶名和密碼匹配,調(diào)用login_user函數(shù)登錄用戶。

8. 創(chuàng)建登錄頁面

接下來,我們需要創(chuàng)建一個登錄頁面,以便用戶能夠輸入用戶名和密碼。請在templates文件夾中創(chuàng)建login.html文件:

nano templates/login.html

login.html文件中輸入以下內(nèi)容:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登錄</title>
</head>
<body>
    <h1>登錄</h1>
    <form action="/login" method="post">
        <label for="username">用戶名:</label>
        <input type="text" name="username" required>
        <br>
        <label for="password">密碼:</label>
        <input type="password" name="password" required>
        <br>
        <input type="submit" value="登錄">
    </form>
</body>
</html>

代碼說明:

  • 登錄表單:創(chuàng)建一個表單用于輸入用戶名和密碼,表單的action屬性指向/login路由,method設(shè)為POST。

  • 輸入字段:使用<input>標簽收集用戶名和密碼。

9. 添加登出功能

為了允許用戶登出,我們可以在app.py中添加一個新的路由處理登出請求:

# 登出路由
@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

代碼說明:

  • 登出路由 /logout:調(diào)用logout_user()函數(shù)登出當前用戶,并重定向到登錄頁面。

10. 更新首頁以顯示登出鏈接

index.html中,添加一個登出鏈接,方便用戶登出:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>樹莓派 NAS 文件上傳</title>
</head>
<body>
    <h1>樹莓派 NAS 文件上傳</h1>
    <a href="/logout">登出</a>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" required>
        <input type="submit" value="上傳">
    </form>
    <a href="/files">查看已上傳文件</a>
</body>
</html>

代碼說明:

  • 登出鏈接:添加一個指向登出路由的鏈接,允許用戶在上傳文件后退出登錄。

  • 查看已上傳文件鏈接:添加一個鏈接,指向/files路由,方便用戶查看之前上傳的文件。

11. 完成代碼整合

確保在app.py的頂部導入所需的Flask-Login模塊:

from flask\_login import LoginManager, UserMixin, login\_user, login\_required, logout\_user, current_user

12. 啟動應用

確保您在終端中運行以下命令以啟動Flask應用:

python3 app.py

訪問樹莓派的IP地址和5000端口(例如http://192.168.1.100:5000),您將看到登錄頁面。

13. 測試訪問管理功能

  1. 登錄:使用用戶名admin和密碼password進行登錄。

  2. 文件上傳:成功登錄后,將被重定向到文件上傳界面,您可以選擇文件并上傳。

  3. 查看已上傳文件:上傳完成后,點擊"查看已上傳文件"鏈接,查看文件列表。

  4. 登出:完成操作后,點擊"登出"鏈接,確保可以成功退出。

五、項目總結(jié)

在本項目中,我們成功地使用樹莓派搭建了一個功能齊全的網(wǎng)絡附加存儲(NAS)系統(tǒng)。該系統(tǒng)不僅可以實現(xiàn)文件的上傳和存儲,還具備基本的用戶訪問管理功能,確保了文件的安全性和訪問的便捷性。以下是項目的主要特點和總結(jié):

項目特點

  1. 可視化界面:我們使用Flask框架構(gòu)建了一個簡單的Web界面,用戶可以通過瀏覽器輕松上傳文件、查看已上傳的文件和進行登錄/logout操作。

  2. 文件存儲:利用Samba協(xié)議實現(xiàn)文件共享,上傳的文件存儲在樹莓派的共享文件夾中,方便局域網(wǎng)內(nèi)的多設(shè)備訪問。

  3. 數(shù)據(jù)庫支持:使用SQLite數(shù)據(jù)庫記錄文件上傳的信息,包括文件名和上傳時間,便于后續(xù)管理和查詢。

  4. 用戶管理:集成了Flask-Login庫,實現(xiàn)了基本的用戶身份驗證功能。通過簡單的用戶名和密碼,用戶可以安全地登錄和登出,防止未授權(quán)訪問。

  5. 簡單易用:整個系統(tǒng)的搭建和使用相對簡單,適合初學者和物聯(lián)網(wǎng)愛好者進行學習和擴展。

項目擴展建議

盡管本項目已經(jīng)具備基本的功能,但仍有許多可以改進和擴展的地方:

  • 增強安全性:使用更強的身份驗證機制,例如密碼哈希存儲和HTTPS加密,確保用戶數(shù)據(jù)的安全性。

  • 文件管理功能:增加文件刪除、重命名等管理功能,提高用戶的使用體驗。

  • 用戶注冊系統(tǒng):允許用戶注冊,存儲用戶信息,并支持不同用戶對文件的不同訪問權(quán)限。

  • 前端優(yōu)化:使用現(xiàn)代前端框架(如React、Vue.js等)改進用戶界面,增加用戶交互體驗。

  • 移動端適配:優(yōu)化網(wǎng)站在移動設(shè)備上的顯示效果,增加用戶的使用靈活性。

總結(jié)

通過本項目,我們不僅學習了如何使用樹莓派搭建一個NAS系統(tǒng),還深入了解了Web開發(fā)、數(shù)據(jù)庫管理和用戶身份驗證等多個重要概念。這為我們?nèi)蘸箝_發(fā)更復雜的物聯(lián)網(wǎng)應用打下了良好的基礎(chǔ)。希望通過這篇文章,能夠幫助更多的開發(fā)者和愛好者快速上手物聯(lián)網(wǎng)項目,并激發(fā)他們的創(chuàng)造力去探索更廣泛的應用場景。

如有任何問題或建議,歡迎在評論區(qū)留言討論。感謝您的閱讀,祝您在物聯(lián)網(wǎng)的探索中取得成功!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容