Django实现垃圾分类交互系统:从环境搭建到视图逻辑详解
本文详细讲解如何利用Django框架构建一个支持用户交互的垃圾分类Web应用。内容涵盖Django的MVT模型原理、项目与App的创建流程、路由分发机制、视图层代码编写以及模板层的HTML实现。通过具体代码示例,演示如何接收图片上传、调用识别接口并返回分类结果,适合希望快速掌握Django基础应用的开发者参考。
标题:利用Django实现一个能与用户交互的初级框架 作者:Sun-Wind 日期:2021年9月1日
Django实现基本的框架
- 该框架的核心功能是搭建服务器,实现服务器与客户端之间的数据交互。
- 此框架具备接收客户端请求,并根据请求内容返回相应处理结果的能力。
本文将以一个垃圾识别分类的具体案例为例进行说明。
Django简介
Django是一个由Python编写的开源Web应用框架。借助Django,Python开发人员仅需编写少量代码,即可轻松完成正式网站所需的大部分功能,并进一步开发出全功能的Web服务。
MVC模型
Django底层基于MVC(Model-View-Controller,模型-视图-控制器)设计模式。MVC模式使得后续对程序的修改和扩展更加简化,同时促进了程序各部分代码的复用。

MVT模型
Django的MTV模式在本质上与MVC一致,旨在保持各组件间的松耦合关系,仅在定义上略有不同。Django的MTV分别指代: M(Model,模型):负责业务逻辑及数据库映射(ORM)。 T(Template,模板):负责页面(HTML)的展示逻辑。 V(View,视图):负责业务逻辑处理,并适时调用Model和Template。 除上述三层外,还需一个URL分发器,其作用是将不同的URL请求分发给对应的View处理,View再调用相应的Model和Template。MTV的响应模式如下图所示: 简易流程图:

创建垃圾分类项目
注意:本文示例基于Windows系统,不同操作系统下的指令可能有所差异。
<django-admin startproject rub>
执行上述指令即可创建项目。 此时Django会自动生成一个项目框架结构,下文将对各部分逐一解释。
- rub:项目的根容器目录。
- manage.py:一个实用的命令行工具,用于与项目进行交互操作。
- __init__.py:空文件,用于标识该目录为Python包。
- asgi.py:ASGI兼容的Web服务器入口文件,用于运行项目。
- settings.py:项目的配置文件,包含数据库配置、访问权限、链接设置等。
- urls.py:项目的URL(路由)声明文件。
- wsgi.py:WSGI兼容的Web服务器入口文件,用于运行项目。
运行我们的项目
<py manage.py runserver 0.0.0.0:8000>
通过上述命令启动项目。
该命令需在rub文件夹目录下执行。
其中0.0.0.0允许局域网内的其他电脑访问该网站,8000为端口号,也可修改为其他端口;若不指定端口号,默认使用8000。
执行后命令行会生成对应的本地服务器HTTP地址,访问后显示如下界面:

如果无法访问,请检查是否因端口被占用导致,可尝试更换其他端口号。
顺便提一句,8000端口被占用通常是因为酷狗音乐等软件在后台运行[]( ̄▽ ̄)*。
创建app
Django规定,若需使用模型层,必须创建一个app(尽管本项目较为简单,可能无需使用,但仍在此演示)。
<django-admin.py startapp app>
随后Django会自动生成app的框架结构。
<py manage.py migrate> # 创建表结构
< py manage.py makemigrations app> # 让 Django 知道我们在我们的模型有一些变更
<py manage.py migrate app> # 创建表结构
运行以上指令可完成数据库表单的创建。
此处仅为额外引入,实际上本项目实现较为简单,可以无需使用数据库功能。
配置路由
路由简单来说,就是根据用户请求的URL链接判断对应的处理程序,并返回处理结果,即建立URL与Django视图之间的映射关系。
我们在rub的主路由中添加如下配置:
<path('',include('app.urls')),>
利用include语句可以将app的路由映射进来,这样我们只需直接配置app的路由即可。
include指的是路由的分发。
Django项目中多个app目录共用一个urls文件容易造成混淆,后期维护也不方便。
使用路由分发(include),让每个app目录都单独拥有自己的urls文件。
在app的路由文件中加入如下配置:
< path('',views.index,name = 'index'),>
<path('upload1',views.upload1,name = 'upload1'),>
path方法
Django的path()函数可以接收四个参数,其中两个为必选参数:route、view,以及两个可选参数:kwargs、name。
- route:字符串,表示URL规则,与之匹配的URL将执行第二个参数view。
- view:用于执行匹配URL请求的处理函数。
- kwargs:字典参数(通过此参数可以实现网页变量的解析操作,后续会有解释)。
- name:用于反向获取URL。
视图层
在app的视图层中加入如下代码:
def index(request):
return render(request,'app/index.html')
def upload1(request):
myfile = request.FILES.get('pic',None)
if not myfile:
return HttpResponse("没有上传的文件信息:")
filename = str(time.time()) + "." + myfile.name.split('.').pop()#这里是对文件名进行预处理操作,时间函数可以随机化一个值,用str方法转换为字符串,然后用split拆分后缀名,可以实现任意图片形式的保存
destination = open("./static/pic/" + filename,"wb+")#利用open函数和chunks流写入static文件夹
for chunk in myfile.chunks(): # 分块写入文件
destination.write(chunk)
destination.close()
label = predict_img(path="static/pic/" + filename)#此处是垃圾分类识别函数,因为竞赛相关,就不放出具体的识别代码了,读者可以参考相关资料自行补充此函数
print(label)
os.remove("./static/pic/"+filename)#这里删除文件,防止用户传入文件占用内存的问题
context = {}
context['result'] = label # 将result变量对应的键值设为lable,这样可以让html文件解析lable变量
return render(request,'app/result.html',context)
接下来我们逐一解读上述代码。 render():返回文本,第一个参数为request,第二个参数为字符串(页面名称),第三个参数为字典(可选参数,用于向页面传递参数:键为页面参数名,值为views中的变量名)。 简而言之,就是根据路径返回我们需要的页面。 注意这里要写成app/index而不是rub/index,虽然index的网页文件在rub的templates下创立。 Request是一个对象,其属性简述如下:
- path:请求页面的全路径,不包括域名——例如,“/hello/”。m
- ethod:请求中使用的HTTP方法的字符串表示。全大写表示。如
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
- FILES
包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file" name="" />标签中name属性的值。FILES中的每个value同时也是一个标准Python字典对象,包含下面三个Keys:
filename:上传文件名,用Python字符串表示。
content-type:上传文件的Content type。
content:上传文件的原始内容。
注意:只有在请求方法是POST,并且请求页面中
模板
模板是一个文本,用于分离文档的表现形式和内容。 在rub目录下建立templates文件夹,届时Django在通过URL寻找时会直接在此文件夹中找到对应的网页文件。在template文件夹下新建一个app文件夹。 建立的index.html文件如下:
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>垃圾分类管理</title>
</head>
<body>
<h2>垃圾分类管理</h2>
{% include 'app/upload.html' %}
</body>
</html>
{% include %} 标签允许在模板中包含其它的模板的内容。 upload.html文件如下:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width = device-width,initial-scale=1.0">
<title> Document </title>
</head>
<body>
<h2>文件上传 </h2>
<form action = "{% url 'upload1' %}" method = "post" enctype="multipart/form-data">
{% csrf_token %}
图片序号:<input type = "text" name = "title"/><br/><br/>
请上传需要识别的图片:<input type = "file" name = "pic"/><br/><br>
<input type = "submit" value = "上传"/>
</form>
</body>
</html>
这里只讲解一下csrf。 csrf_token 用于form表单中,作用是跨站请求伪造保护。 如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。 用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。 至于其他的就是html语言的学习了,这里只简要讲解一下。 在表单当中,input标签后面跟对应的type属性,可以上传相关的数据到后面的name键位当中。 {% url 'upload1' %}是反方向解析URL,这里会直接将我们输入的信息提交到uoload1URL当中,然后会激活对应的视图层,也就是说我们提交的图片最终会传到upload1函数中。 我们在上文当中提到的配置path路径中的name就是这样的作用,这里图片上传的name是'pic'对应于我们在上文方法中引用的FILE.get中的参数。 最后一个result界面
<html>
<div>
<p>垃圾分类的结果是:{{ result }}</p>
</div>
</html>
这里对应视图层当中upload1方法,大家不妨转到视图层当中再看一下upload1函数。 最后其返回的是render方法,然后返回的是result界面。 在这里{{result}}是在html'中定义的一个变量,我们通过render方法可以用lable文本来代替。 最后实现的结果如图所示:

我们只需要上传图片,然后提交利用我们自己写的垃圾分类识别代码即可得到对应的结果。 这里我们提交上我们想要识别的图片:

结果

到此这篇关于Django的基本运用之Django垃圾分类详解的文章就介绍到这了,更多相关Django垃圾分类内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









