• DJango之视图层


    三板斧

    """
    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

    # 视图函数既可以是函数也可以是类
    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的内部执行流程(******)
    

  • 相关阅读:
    JavaIO学习笔记(五)
    Java学习笔记(四)
    Java学习笔记(三)
    Java学习笔记(二)
    自己动手实现STL:前言
    Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
    Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
    Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数
    Effective C++学习笔记 条款04:确定对象被使用前已先被初始化
    Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/12977297.html
Copyright © 2020-2023  润新知