django-视图层
Posted zhuchunyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django-视图层相关的知识,希望对你有一定的参考价值。
########视图层######## 视图层其实就是写一系列的逻辑代码的视图函数 1、讲讲HttpResponse对象 render, HttpResponse, redirect这是我们用到最多三中方法 其实每次返回给前台的数据都是一个HttpResponse对象。 return HttpResponse(‘你好‘) ----> 向前台发送 你好 return render(request,‘index.html‘,{‘name‘:name}) ----> 将模板渲染好了,返回给前台页面 return redirect(‘/index/‘) ----> 重定向作用 render : 首先他将模板index.html先读取出来,当读取到django的模板语法时,执行,在{‘name‘:name}拿数据替换 替换完毕了,返回一个HttpResponse对象给前台 from django.template import Template,Context def test(request): temp = Template(‘<h1>{{ name }}</h1>‘) con = Context({‘name‘:‘zhuyu‘}) ret = temp.render(con) return HttpResponse(ret) redirect:重定向流程:浏览器先向服务端发出请求---->服务端接收到请求并响应回去,这是响应回去携带数据(以3开头的状态码,和 需要重定向的url---->浏览接收到服务端的响应,看到是3开头的状态码,就像携带过来的url再去发出请求---->服务端接 收到请求,并响应给浏览器----->浏览器接收到响应,看到状态码是200,就把响应体内的内容在页面是显示。) 2、讲讲JsonResponse对象(一看就知道,就是给前台返回json格式的数据) from django.http import JsonResponse 假如我不用JsonResponse,也可以向前台传json格式数据 import json dic = {‘name‘:‘zhuyu,‘age‘:21} return HttpResponse(json.dumps(dic)) 通过上面的方法是可行的,但我直接用jsonResponse就不需要自己手动转成json中间格式 return JsonResponse(dic) #它的内部就是用上面的方法实现的,可能有点点差距 lis = [‘zhuyu‘,18] return JsonResponse(lis) #这样是会报错的,你点进去查看该源码,会发现有safe参数,它默认为True #这里你把safe改为False,就可以将其他格式转换成json中间格式了 return JsonResponse(lis,safe=False) #不会报错 3、CBV和FBV CBV------->通过类去处理请求 FBV------->通过函数去处理请求 FBV就不用说了吧,之前的都是用FBV写的视图函数 下面写写CBV怎么处理前端过来的请求: from views import View class Index(View): #必须继承View才可以,和前面orm必须继承models.Model是一样的。 def get(self,request): return HttpResponse(‘get请求我来处理‘) def post(self,request): return HttpResponse(‘post请求我来处理‘) #在视图层写好了,必须要在路由层去配置关系 urlpatterns = [ url(r‘^index/‘,views.Index.as_view()) ] #配置完了,就可以通过浏览访问改路径了:你是get请求就会走到视图层该类里的get方法,post请求就会走到post方法 #为什么这样子呢?当然是django给你封装了,views.Index.as_view() 它的返回值就是函数的内存地址。自己看源码 #吧,它是怎么运行的。 4、简单的文件上传 记住:前端过来的请求携带的所有数据,我们都可以通过request去拿到。request就是wsgiref那里将数据处理,封装成 一个对象,并传递过来。 下面写写request对象里的一些方法属性吧 request.method #请求的方式 request.POST #post请求,form表单的数据,这是一个QueryDict对象,它是继承字典,所以可以用字典取值方法 request.GET #和post一样,不过它是将get请求携带的数据放这里面,也是QueryDict对象 request.META #将请求头的信息放这里 request.body #post请求,请求体里的内容,这里是没有进行处理的,bytes类型 request.FIlES #上传文件的内容,他也是个对象,一样继承了字典,取值的方法你也应该知道了吧 request.path #请求的url 好了,了解到了这里,写写文件上传 首先你需要一个html页面(伪代码了): html代码: <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="提交"> </form> 视图层: def aaa(request): if request.method == ‘POST‘: file = request.FILES.get(‘file‘) filename = file.get(‘name‘) with open(filename,‘wb‘) as f: for line in file: f.write(line) return HttpResponse(‘ok‘) 提醒下:这里的file是一个文件的对象,,和 f= open(‘a.txt‘) 中的f差不多 也是可以迭代的。 这里补充一点:假如 dic = {‘name‘: ‘朱宇‘, ‘male‘: ‘男‘} dic = json.dumps(dic) print(dic) 打印结果为:{"name": "u6731u5b87", "male": "u7537"} 这是json函数中有个默认参数ensure_ascii,默认是为True,默认是ascii编码,你把True改为False就行了 dic = json.dumps(dic,ensure_ascii=False) print(dic) 这样你的打印才是 {"name": "朱宇", "male": "男"} 那我们用JsonResponse()时该怎么去使用呢? JsonResponse(dic,json_dumps_params={‘ensure_ascii‘: False})
以上是关于django-视图层的主要内容,如果未能解决你的问题,请参考以下文章