zoukankan      html  css  js  c++  java
  • 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})
  • 相关阅读:
    每日总结32
    每日总结31
    每日总结30
    Leetcode 115. 不同的子序列(二维DP)
    Leetcode 59. 螺旋矩阵 II
    Leetcode 227. 基本计算器 II
    macOS下将GitHub中单个子文件夹下载到本地
    P3796 【模板】AC自动机(加强版)
    P3808 【模板】AC自动机(简单版)
    【Kubernetes】副本的删除
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/9931553.html
Copyright © 2011-2022 走看看