- 网络云盘设计流程(第一篇)
- 前言
- 前期准备与环境搭建
- 创建一个Django工程,跑一个HelloWorld
- 网盘设计简介及成果展示
- 功能1,“登录”的实现
- 功能3,4,“存储空间内所有文件的展示及文件描述”的实现
- 功能5,“文件下载”的实现
- 功能6,“批量上传文件”的实现
- 功能7,“删除文件”的实现
- 功能8,“上传文件进度条”的实现
- 结束语
这是一款基于Python语言,Django框架的网络云盘,内容较多,我将整个项目分为三篇文章来讲解,这是第一篇,主要讲述内容包括环境的搭建,Django各文件的配置情况,以及呈现一个简单的云盘网站(功能未完善,剩余部分将在第二篇讲述),谢谢大家的持续关注!
前期准备与环境搭建作为网站的必备,你需要一台云主机,建议选择Windows镜像,拿到云主机之后你需要配置Pycharm专业版软件(这里必须是专业版,社区版没有Django服务),以及Python环境。
环境配置好后你需要添加入站和出站规则,端口号就写你希望外界访问的端口号。(图片略)
最后你需要配置数据库,SQL server,Mysql都可以,我这里使用的是SQL server。数据库安装后记得开启TCP服务。
以上就是全部的环境搭建,服务器配置不错的小伙伴们可以安装Anaconda和SQL server Manager,以便于扩展更多功能。以上过程如果遇到问题请大家自行百度哈~
点击New Project,选择Django,选择自己本机的Python环境,点击create。点击右上角Edit Configurations,将Host改为0.0.0.0,端口号自己定义。
打开你工程目录下的urls.py文件,代码改为
from django.contrib import admin
from django.urls import path, re_path
urlpatterns = [
path('hello', Do.hello, name='hello'),
]
这里大致意思为,访问XXX.XXX.XXX.XXX:XXX/hello这个url时,会调用DO.py文件中的hello函数。
接下来在工程主目录下新建Do.py文件(也可以是其他名字,但要在urls.py文件上做相应修改)
import json
import time
from urllib import parse
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
import pymssql
from django.contrib import messages
from django.shortcuts import render
from Biye.settings import BASE_DIR
def hello(request):
return render(request, './hello.html')
接下来修改settings.py文件
ROOT_URLCONF = 'Biye.urls'#这里是指定项目的url配置文件
STATIC_URL = '/static/'#这里是设置存放网页CSS的目录
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static/'),
)
ALLOWED_HOSTS = ['*']#这里是设置开放端口
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR , 'templates'],#这里是指定html文件位置
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
接下来在templates文件夹下新建hello.html
Title
hello world
运行工程,使用另一台电脑或者手机访问XXX.XXX.XXX.XXX:XXX/hello,结果如下
以上就是新建一个Django工程的全部流程,下面云盘的设计也是基于这个基础之上的,希望小伙伴们自己动手尝试一下哦。
设计这款云盘的初衷在于,更加便捷地在不同操作系统,不同设备之间传递文件,同时也是为了在毕设中存放训练模型和数据集。如果你是硬件大佬,经常需要在树莓派或者其他实时OS的开发板做项目,如果你经常需要在WIndows系统和Linux系统之间传递文件,并且曾被文件系统的差异造成困扰,那么这款网络云盘一定适合你!
下面是网盘的几张图
云盘应具备以下几种功能
1.登录功能
2.注册功能(第二篇文章介绍)
3.存储空间内所有文件的展示,包括文件夹和其他文件
4.文件的备注,上传时间,文件大小展示,如遇到文件夹,应返回其所有子文件的大小之和
5.下载文件,批量下载文件
6.上传文件,批量上传文件
7.删除文件
8.上传文件进度条
9.下载整个文件夹(第二篇文章介绍)
10.搜索文件(第二篇文章介绍)
下面开始逐一介绍各功能的实现方式。
def index(request):
if request.method == "POST":
if request.POST.get("text1", None) != "" and request.POST.get("password", None) != "":
connect = pymssql.connect('XXX', 'sa', 'XXX', 'XXX', charset='UTF-8') # 服务器名,账户,密码,数据库名
t1 = request.POST.get("text1", None)
t2 = request.POST.get("password", None)
cursor = connect.cursor() # 创建一个游标对象,python里的sql语句都要通过cursor来执行
sql = "select * from Denglu "
cursor.execute(sql) # 执行sql语句
row = cursor.fetchone() # 读取查询结果,
aa = 0
while row: # 循环读取所有结果
if t1 == row[0].strip() and t2 == row[1].strip():
aa = 1
cursor.close() # 关闭游标
connect.close() # 关闭连接
return render(request, './https://blog.csdn.net/AIERSTOM/article/details/index.html')
row = cursor.fetchone()
if aa == 0:
messages.success(request, "密码或用户名错误")
cursor.close() # 关闭游标
connect.close() # 关闭连接
return render(request, '../templates/web.html')
return render(request, '../templates/web.html')
{% load staticfiles %}
家居控制终端
© 2022 智能家居控制终端. All rights reserved |
这里的HTML来自网上的模板,大家想要自己的界面变得好看,都可以去网上找开源模板,主要写的是后端逻辑。
这段代码的主要逻辑是,submit按钮提交了一个form表单给后台,方法是POST,后台读取到文本框的输入内容,将字符串做处理后与数据库内容进行比对,如果与数据库某一条匹配则进入主系统,如果都不匹配返回登录失败。
def yun(request):
if request.method == "POST":
obj = request.FILES.getlist('new11')
for f in obj:
destination = open(os.path.join(BASE_DIR, 'WebDict', f.name), 'wb')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
# f = open(os.path.join(BASE_DIR, 'WebDict', obj.name), 'wb')
# for chunk in obj.chunks():
# f.write(chunk)
# f.close()
file_dir = "WebDict"
m = 0
selectFiles = [] #记录文件名
sizeFiles = [] #记录文件大小
timeFiles = [] #记录文件创建时间
FilesBig = [] #记录文件夹大小
FileType = [] #记录文件描述
FilePath = [] #记录文件路径
for files in os.listdir(file_dir):
m = m + 1
print(files)
selectFiles = selectFiles +[files]
FilePath = FilePath + [file_dir + "/" + files]
if os.path.isdir(file_dir + "/" + files):
FileType = FileType +["文件夹"]
full_size = sum(sum(os.path.getsize(os.path.join(parent, file)) for file in files) for parent, dirs, files in
os.walk(file_dir + "/" + files))
if full_size / float(1024) > 1024 :
sizeFiles = sizeFiles + [round(full_size/ float(1024*1024), 1)]
FilesBig = FilesBig + ["MB"]
else:
sizeFiles = sizeFiles + [round(full_size/ float(1024), 1)]
FilesBig = FilesBig + ["KB"]
else:
FileType = FileType + [""]
if os.path.getsize(file_dir + "/" + files) / float(1024)>1024:
sizeFiles = sizeFiles + [round(os.path.getsize(file_dir + "/" + files) / float(1024*1024), 1)]
FilesBig = FilesBig + ["MB"]
else:
sizeFiles = sizeFiles + [round(os.path.getsize(file_dir + "/" + files) / float(1024), 1)]
FilesBig = FilesBig + ["KB"]
timeFiles = timeFiles + [time.ctime(os.path.getctime(file_dir + "/" + files))]
files = zip(selectFiles, sizeFiles, timeFiles,FilesBig,FileType,FilePath)
return render(request, "yun.html", {"files": files})
| 文件名 | 文件备注 | 上传时间 | 文件大小 | 删除文件 |
|---|---|---|---|---|
| { NN }} > {% if PP == "文件夹"%} {% endif %} {{ xx }} | {{ PP }} | {{ zz }} | {{ yy }} {{ QQ }} | 删除 |



