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

  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/bigorangecc/p/12970625.html
Copyright © 2011-2022 走看看