Django的基本运用(垃圾分类) (2)

在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属性的值. 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>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpdzy.html