title: 利用Django实现一个能与用户交互的初级框架

author: Sun-Wind

date: September 1, 2021

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是一个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/"。
  • method 请求中使用的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,并且请求页面中有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。

    FILE的get方法,第一个参数来源于所收到请求的html文件,里面包含有图片名.第二个参数是如果没有接收到文件,就返回None

    HttpResponse(): 返回文本,参数为字符串,字符串中写文本内容。如果参数为字符串里含有 html 标签,也可以渲染。

    static是Django的静态文件保存处,需要在rub目录当中创建,可以保存文本文件,css,js文件

模板

模板是一个文本,用于分离文档的表现形式和内容

在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的基本运用(垃圾分类)的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. django server之间通过remote user 相互调用

    首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  8. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  9. Django

    一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...

随机推荐

  1. Linux day2 随堂笔记

    计算机的硬件组成 主机.输入设备.输出设备 一.运维人员的核心职责 1. 企业数据安全 2. 企业业务724运行(不宕机) 3. 企业业务服务率高(用户体验好) 4. 运维人员的工作内容 日常服务器维 ...

  2. 流暢的pyhton4---數據庫備份

    一.linux數據庫備份腳本 1.数据库备份,命令如下: ./pg_dump -h localhost -p 5432 -U postgres -W -F c -b -v -f "/opt/ ...

  3. 第十篇 -- 学习C++宝典2005版

    最近看了C++宝典,看时间是2005的,对于里面的程序自己也进行了编写,由于时间过久,可能有些函数的用法发生了改变,自己也对其进行了修改,用VS2017可以编译通过. 前四章学习内容 CPlusPlu ...

  4. H5页面怎么跳转到公众号主页?看过来

    前言: 做公众号开发的小伙伴,可能会遇到这种需求: 在一个H5页面点击一个关注公众号按钮跳转到公众号主页. 听到这个需求的一瞬间,疑惑了!这不可能! 摸了摸高亮的额头!没办法,做还是要做的 开始上解决 ...

  5. Spring Messaging 远程命令执行漏洞(CVE-2018-1270)

    影响版本 Spring Framework 5.0 to 5.0.4 Spring Framework 4.3 to 4.3.14 参考 https://www.it610.com/article/1 ...

  6. 大数据学习(07)——Hadoop3.3高可用环境搭建

    前面用了五篇文章来介绍Hadoop的相关模块,理论学完还得操作一把才能加深理解.这一篇我会花相当长的时间从环境搭建开始,到怎么在使用Hadoop,逐步介绍Hadoop的使用. 本篇分这么几段内容: 规 ...

  7. Kubernetes的基本概念和术语

    Kubernetes中的大部分概念如Node.Pod.Replication Controller. Service等都可以被看作一种资源对象,几乎所有资源对象都可以通过 Kubernetes提供的k ...

  8. Kotlin强化实战!这份学习手册让你的面试稳如泰山

    一.引言 正如官网的slogan所描述:kotlin,是一门让程序员写代码时更有幸福的现代语言. 同时,也正如维基百科里介绍: JetBrains公司希望Kotlin能够推动IntelliJ IDEA ...

  9. NTP 集群简略部署指南

    NTP 集群简略部署指南 by 无若 1. NTP 简介 网络时间协议(英语:Network Time Protocol,简称NTP)是在数据网络潜伏时间可变的计算机系统之间通过分组交换进行时钟同步的 ...

  10. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1160/1170两款MCU的FlexSPI NOR启动的连接方式. 这个 i.MXRT FlexSPI NOR 启动 ...