zoukankan      html  css  js  c++  java
  • 【2020Python修炼记】web框架之 Django的视图层

    【目录】

    一、三板斧

    二、JsonResponse 对象

    三、form表单上传文件以及后端如何操作

    四、request 对象方法·总结

    五、FBV 与 CBV (针对视图函数 views.py) 

    六、settings源码剖析(尝试理解)

    一、三板斧

    """
    HttpResponse
        返回字符串类型
    render
        返回html页面 并且在返回给浏览器之前还可以给html文件传值
    redirect
        重定向
    """
    # 视图函数必须要返回一个HttpResponse对象  正确   研究三者的源码即可得处结论
    The view app01.views.index didn't return an HttpResponse object. It returned None instead.
    
    # render简单内部原理
            from django.template import Template,Context
        res = Template('<h1>{{ user }}</h1>')
        con = Context({'user':{'username':'jason','password':123}})
        ret = res.render(con)
        print(ret)
        return HttpResponse(ret)

    二、JsonResponse 对象

    """
    json格式的数据有什么用?
        前后端数据交互需要使用到json作为过渡 实现跨语言传输数据
    
    前端序列化
        JSON.stringify()                    json.dumps()
        JSON.parse()                            json.loads()
    """
    import json
    from django.http import JsonResponse
    def ab_json(request):
        user_dict = {'username':'jason好帅哦,我好喜欢!','password':'123','hobby':'girl'}
    
        l = [111,222,333,444,555]
        # 先转成json格式字符串
        # json_str = json.dumps(user_dict,ensure_ascii=False)
        # 将该字符串返回
        # return HttpResponse(json_str)
        # 读源码掌握用法
        # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
        # In order to allow non-dict objects to be serialized set the safe parameter to False.
        # return JsonResponse(l,safe=False)  
        # 默认只能序列化字典 序列化其他需要加safe参数    

    三、form表单上传文件以及后端如何操作

    """
    form表单上传文件类型的数据
        1.method必须指定成post
        2.enctype必须换成formdata
    
    """
    def ab_file(request):
        if request.method == 'POST':
            # print(request.POST)  # 只能获取普通的简直对数据 文件不行
            print(request.FILES)  # 获取文件数据
            # <MultiValueDict: {'file': [<InMemoryUploadedFile: u=1288812541,1979816195&fm=26&gp=0.jpg (image/jpeg)>]}>
            file_obj = request.FILES.get('file')  # 文件对象
            print(file_obj.name)
            with open(file_obj.name,'wb') as f:
                for line in file_obj.chunks():  # 推荐加上chunks方法 其实跟不加是一样的都是一行行的读取
                    f.write(line)
    
        return render(request,'form.html')

    四、request 对象方法·总结 

    """
    request.method
    request.POST
    request.GET
    request.FILES
    request.body  # 原生的浏览器发过来的二进制数据  后面详细的讲
    request.path 
    request.path_info
    request.get_full_path()  能过获取完整的url及问号后面的参数 
    """
        print(request.path)  # /app01/ab_file/
        print(request.path_info)  # /app01/ab_file/
        print(request.get_full_path())  # /app01/ab_file/?username=jason

    五、FBV 与 CBV (针对视图函数 views.py)

    CBV基于类的视图(Class base view)和FBV基于函数的视图(Function base view)

    参考阅读:https://www.jianshu.com/p/8c23d72878d9

    # 视图函数既可以是函数也可以是类
    def index(request):
      return HttpResponse('index')
    
    # CBV
        # CBV路由
        url(r'^login/',views.MyLogin.as_view())
    
    
            from django.views import View
    
    
            class MyLogin(View):
            def get(self,request):
            return render(request,'form.html')
    
            def post(self,request):
            return HttpResponse('post方法')
          
    """
    FBV和CBV各有千秋
    CBV特点
        能够直接根据请求方式的不同直接匹配到对应的方法执行
        
        内部到底是怎么实现的?
            CBV内部源码(******)
    """

     CBV源码剖析 

    # 你自己不要修改源码 出了bug很难找
    
    # 突破口在urls.py
    url(r'^login/',views.MyLogin.as_view())
    # url(r'^login/',views.view)  FBV一模一样
    # CBV与FBV在路由匹配上本质是一样的 都是路由 对应 函数内存地址
    """
    函数名/方法名 加括号执行优先级最高
    猜测
        as_view()
            要么是被@staicmethod修饰的静态方法
            要么是被@classmethod修饰的类方法  正确
            
        @classonlymethod
        def as_view(cls, **initkwargs):
            pass
    """
    
        @classonlymethod
        def as_view(cls, **initkwargs):
            """
            cls就是我们自己写的类   MyCBV
            Main entry point for a request-response process.
            """
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)  # cls是我们自己写的类
                # self = MyLogin(**initkwargs)  产生一个我们自己写的类的对象
                return self.dispatch(request, *args, **kwargs)
                """
                以后你们会经常需要看源码 但是在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序
                    先从对象自己找
                    再去产生对象的类里面找
                    之后再去父类找
                    ...
                总结:看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁
                """
            return view
          
            # CBV的精髓
        def dispatch(self, request, *args, **kwargs):
            # 获取当前请求的小写格式 然后比对当前请求方式是否合法
            # get请求为例
            # post请求
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
                """
                反射:通过字符串来操作对象的属性或者方法
                    handler = getattr(自己写的类产生的对象,'get',当找不到get属性或者方法的时候就会用第三个参数)
                    handler = 我们自己写的类里面的get方法
                """
            else:
                handler = self.http_method_not_allowed
            return handler(request, *args, **kwargs)
            """
            自动调用get方法
            """
    
    # 要求掌握到不看源码也能够描述出CBV的内部执行流程(******)

    六、settings源码剖析(尝试理解)

    参考阅读:

    https://www.cnblogs.com/Dominic-Ji/articles/10982298.html

  • 相关阅读:
    2020-03-15助教一周小结(第五周)
    2020-03-08助教一周小结(第四周)
    2020-03-01 助教一周小结(第三周)
    助教一周小结(第二周)
    2020-02-16 助教一周小结(第一周)
    201771010135 杨蓉庆《面对对象程序设计(java)》第十二周学习总结
    201771010135 杨蓉庆AND张燕 《面对对象程序设计(java)》第十一周学习总结
    201771010135 杨蓉庆《面对对象程序设计(java)》第十周学习总结
    201771010135杨蓉庆 《面对对象程序设计(java)》第九周学习总结
    201771010135杨蓉庆 《面对对象程序设计(java)》第八周学习总结
  • 原文地址:https://www.cnblogs.com/bigorangecc/p/12970625.html
Copyright © 2011-2022 走看看