手机网站设计占工程比重,开发公司只给开具收据不能认定合同有效案例,珠海网站制作,上海口碑最好的家装一、项目概述
随着物联网#xff08;IoT#xff09;技术的发展#xff0c;数据存储和共享需求日益增长。本文将介绍如何利用树莓派#xff08;Raspberry Pi#xff09;搭建一个网络附加存储#xff08;NAS#xff09;系统#xff0c;以实现数据的集中管理、共享和访问…一、项目概述
随着物联网IoT技术的发展数据存储和共享需求日益增长。本文将介绍如何利用树莓派Raspberry Pi搭建一个网络附加存储NAS系统以实现数据的集中管理、共享和访问。该系统具备可视化界面和访问管理功能用户可以通过Web界面方便地管理文件实现跨设备访问适合家庭或小型办公室使用。
二、系统架构
1. 硬件选择 单片机树莓派4 Model B 存储设备外接USB硬盘或SD卡 网络设备支持Wi-Fi或有线网络的路由器
2. 软件技术栈 操作系统Raspberry Pi OS基于Debian 文件共享协议Samba用于文件共享 后端框架FlaskPython Web框架 前端技术HTML、CSS、JavaScript用于构建可视化界面 数据库SQLite用于管理用户信息和访问记录
3. 系统架构图 #mermaid-svg-xOskOHo1KXg5PQAG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xOskOHo1KXg5PQAG .error-icon{fill:#552222;}#mermaid-svg-xOskOHo1KXg5PQAG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xOskOHo1KXg5PQAG .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-xOskOHo1KXg5PQAG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xOskOHo1KXg5PQAG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xOskOHo1KXg5PQAG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xOskOHo1KXg5PQAG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xOskOHo1KXg5PQAG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xOskOHo1KXg5PQAG .marker.cross{stroke:#333333;}#mermaid-svg-xOskOHo1KXg5PQAG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xOskOHo1KXg5PQAG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xOskOHo1KXg5PQAG .cluster-label text{fill:#333;}#mermaid-svg-xOskOHo1KXg5PQAG .cluster-label span{color:#333;}#mermaid-svg-xOskOHo1KXg5PQAG .label text,#mermaid-svg-xOskOHo1KXg5PQAG span{fill:#333;color:#333;}#mermaid-svg-xOskOHo1KXg5PQAG .node rect,#mermaid-svg-xOskOHo1KXg5PQAG .node circle,#mermaid-svg-xOskOHo1KXg5PQAG .node ellipse,#mermaid-svg-xOskOHo1KXg5PQAG .node polygon,#mermaid-svg-xOskOHo1KXg5PQAG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xOskOHo1KXg5PQAG .node .label{text-align:center;}#mermaid-svg-xOskOHo1KXg5PQAG .node.clickable{cursor:pointer;}#mermaid-svg-xOskOHo1KXg5PQAG .arrowheadPath{fill:#333333;}#mermaid-svg-xOskOHo1KXg5PQAG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xOskOHo1KXg5PQAG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xOskOHo1KXg5PQAG .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-xOskOHo1KXg5PQAG .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-xOskOHo1KXg5PQAG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xOskOHo1KXg5PQAG .cluster text{fill:#333;}#mermaid-svg-xOskOHo1KXg5PQAG .cluster span{color:#333;}#mermaid-svg-xOskOHo1KXg5PQAG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xOskOHo1KXg5PQAG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 访问 请求 操作 存储 访问记录 用户登录 验证用户 用户 Web界面 Flask后端 Samba文件共享 USB硬盘 SQLite数据库 Flask-Login 用户信息 三、环境搭建
1. 准备环境
首先需要将Raspberry Pi OS安装到树莓派中。可以通过官方的树莓派 Imager工具将操作系统写入SD卡。
2. 安装必要的软件包
通过SSH或直接在树莓派终端中执行以下命令
\# 更新软件包列表sudo apt update
sudo apt upgrade -y\# 安装Sambasudo apt install samba samba-common-bin -y\# 安装Flask及其依赖sudo apt install python3-flask python3-sqlite3 -y3. 配置Samba
编辑Samba配置文件以共享文件夹
sudo nano /etc/samba/smb.conf在文件末尾添加以下内容
\[PiNAS\]path /home/pi/nasavailable yesvalid users piread only nobrowsable yespublic yeswritable yes创建共享文件夹并设置权限
mkdir /home/pi/nassudo chown -R pi:pi /home/pi/nas重启Samba服务
sudo systemctl restart smbd四、代码实现
1. 创建Flask应用
创建一个新的目录用于存放Flask项目
mkdir ~/flask\_nascd ~/flask\_nas在该目录下创建app.py文件
from flask import Flask, render_template, request, redirect, url_for
import os
import sqlite3app Flask(__name__)DATABASE nas.dbdef get_db():conn sqlite3.connect(DATABASE)return connapp.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(host0.0.0.0, port5000)代码说明 导入模块引入Flask框架及其相关模块以及用于操作文件和数据库的os和sqlite3模块。 创建Flask应用实例化Flask应用。 数据库连接函数get_db()函数用于连接SQLite数据库。 首页路由访问根地址时返回index.html模板。 文件上传路由处理文件上传的POST请求。检查上传的文件是否存在如果文件名为空则重定向回首页。如果文件存在将其保存到指定的共享文件夹。 运行应用通过app.run()启动Flask应用让它在所有可用的网络接口上运行0.0.0.0并监听5000端口。
2. 创建前端页面
在flask_nas目录下创建templates文件夹并在其中创建index.html文件
mkdir templates
cd templates
nano index.html在index.html中输入以下内容
!DOCTYPE html
html langzh
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title树莓派 NAS 文件上传/title
/head
bodyh1树莓派 NAS 文件上传/h1form action/upload methodpost enctypemultipart/form-datainput typefile namefile requiredinput typesubmit value上传/form
/body
/html代码说明 HTML结构使用标准的HTML5文档结构。 表单创建一个表单用于文件上传。action属性指向/upload路由method设为POST并使用enctypemultipart/form-data来支持文件上传。 文件输入input typefile用于选择文件required属性确保用户必须选择一个文件才能提交表单。 提交按钮input typesubmit用于提交表单。
3. 数据库初始化
为了记录用户上传的文件信息可以创建一个SQLite数据库并在app.py中添加数据库初始化逻辑。首先在flask_nas目录下创建一个nas.db数据库
sqlite3 nas.db在SQLite命令行中输入以下SQL语句创建一个文件记录表
CREATE TABLE files (id INTEGER PRIMARY KEY AUTOINCREMENT,filename TEXT NOT NULL,upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);然后在upload_file函数中保存文件上传的记录
# 在upload_file函数中添加以下代码
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:50005. 测试文件上传功能 选择文件在页面上点击选择文件按钮选择要上传的文件。 上传文件点击上传按钮文件将被上传到树莓派的共享文件夹中。 检查文件在终端中您可以通过以下命令查看上传的文件 ls /home/pi/nas您应该能够看到您刚才上传的文件。
6. 数据库记录查看
若要查看上传的文件记录可以在Python中查询数据库。您可以在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, filesuploaded_files)然后在templates文件夹中创建一个新的HTML文件files.html
nano templates/files.html输入以下内容
!DOCTYPE html
html langzh
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title已上传文件列表/title
/head
bodyh1已上传文件列表/h1table border1trth文件名/thth上传时间/th/tr{% for file in files %}trtd{{ file[0] }}/tdtd{{ file[1] }}/td/tr{% endfor %}/tablea href/返回上传页面/a
/body
/html代码说明 新路由/files查询数据库中的文件记录并将结果传递给files.html模板。 文件列表显示在files.html中使用HTML表格来显示已上传文件的名称和上传时间。 返回链接提供一个返回上传页面的链接。
7. 添加访问管理功能
为了增强系统的安全性您可以为文件上传功能添加基本的用户身份验证。我们可以在Flask应用中使用Flask-Login库来实现这一点。
首先安装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# 用户加载回调
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。 用户加载回调定义load_user函数Flask-Login会使用该函数根据用户ID加载用户对象。 登录路由创建一个新的路由/login处理用户的登录请求。若用户名和密码匹配调用login_user函数登录用户。
8. 创建登录页面
接下来我们需要创建一个登录页面以便用户能够输入用户名和密码。请在templates文件夹中创建login.html文件
nano templates/login.html在login.html文件中输入以下内容
!DOCTYPE html
html langzh
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title登录/title
/head
bodyh1登录/h1form action/login methodpostlabel forusername用户名:/labelinput typetext nameusername requiredbrlabel forpassword密码:/labelinput typepassword namepassword requiredbrinput typesubmit value登录/form
/body
/html代码说明 登录表单创建一个表单用于输入用户名和密码表单的action属性指向/login路由method设为POST。 输入字段使用input标签收集用户名和密码。
9. 添加登出功能
为了允许用户登出我们可以在app.py中添加一个新的路由处理登出请求
# 登出路由
app.route(/logout)
login_required
def logout():logout_user()return redirect(url_for(login))代码说明
登出路由 /logout调用logout_user()函数登出当前用户并重定向到登录页面。
10. 更新首页以显示登出链接
在index.html中添加一个登出链接方便用户登出
!DOCTYPE html
html langzh
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title树莓派 NAS 文件上传/title
/head
bodyh1树莓派 NAS 文件上传/h1a href/logout登出/aform action/upload methodpost enctypemultipart/form-datainput typefile namefile requiredinput typesubmit value上传/forma href/files查看已上传文件/a
/body
/html代码说明 登出链接添加一个指向登出路由的链接允许用户在上传文件后退出登录。 查看已上传文件链接添加一个链接指向/files路由方便用户查看之前上传的文件。
11. 完成代码整合
确保在app.py的顶部导入所需的Flask-Login模块
from flask\_login import LoginManager, UserMixin, login\_user, login\_required, logout\_user, current_user12. 启动应用
确保您在终端中运行以下命令以启动Flask应用
python3 app.py访问树莓派的IP地址和5000端口例如http://192.168.1.100:5000您将看到登录页面。
13. 测试访问管理功能 登录使用用户名admin和密码password进行登录。 文件上传成功登录后将被重定向到文件上传界面您可以选择文件并上传。 查看已上传文件上传完成后点击查看已上传文件链接查看文件列表。 登出完成操作后点击登出链接确保可以成功退出。
五、项目总结
在本项目中我们成功地使用树莓派搭建了一个功能齐全的网络附加存储NAS系统。该系统不仅可以实现文件的上传和存储还具备基本的用户访问管理功能确保了文件的安全性和访问的便捷性。以下是项目的主要特点和总结
项目特点 可视化界面我们使用Flask框架构建了一个简单的Web界面用户可以通过浏览器轻松上传文件、查看已上传的文件和进行登录/logout操作。 文件存储利用Samba协议实现文件共享上传的文件存储在树莓派的共享文件夹中方便局域网内的多设备访问。 数据库支持使用SQLite数据库记录文件上传的信息包括文件名和上传时间便于后续管理和查询。 用户管理集成了Flask-Login库实现了基本的用户身份验证功能。通过简单的用户名和密码用户可以安全地登录和登出防止未授权访问。 简单易用整个系统的搭建和使用相对简单适合初学者和物联网爱好者进行学习和扩展。
项目扩展建议
尽管本项目已经具备基本的功能但仍有许多可以改进和扩展的地方 增强安全性使用更强的身份验证机制例如密码哈希存储和HTTPS加密确保用户数据的安全性。 文件管理功能增加文件删除、重命名等管理功能提高用户的使用体验。 用户注册系统允许用户注册存储用户信息并支持不同用户对文件的不同访问权限。 前端优化使用现代前端框架如React、Vue.js等改进用户界面增加用户交互体验。 移动端适配优化网站在移动设备上的显示效果增加用户的使用灵活性。
总结
通过本项目我们不仅学习了如何使用树莓派搭建一个NAS系统还深入了解了Web开发、数据库管理和用户身份验证等多个重要概念。这为我们日后开发更复杂的物联网应用打下了良好的基础。希望通过这篇文章能够帮助更多的开发者和爱好者快速上手物联网项目并激发他们的创造力去探索更广泛的应用场景。
如有任何问题或建议欢迎在评论区留言讨论。感谢您的阅读祝您在物联网的探索中取得成功