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})
原文地址:https://www.cnblogs.com/zhuchunyu/p/9931553.html