Django(五)

JsonResponse类的使用

        # 1. 混合开发项目:前端页面和后端代码写到一块
        # 2. 前后端分离项目:前端是一个项目,后端是一个项目,后端只需要写接口

        json格式的数据:进行跨语言数据传输

        import json
        '''支持的数据类型:str,list, tuple, dict, set'''
        # 序列化出来的数据是可以看得懂的,就是一个字符串
        dumps
        loads

        dump
        load

        import pickle
        '''支持的数据类型:python中的所有数据类型'''
        # 序列化出来的结果看不懂,因为结果是一个二进制
        # pickle序列化出的来的数据只能在python中使用
        dumps
        loads

        dump
        load

        # js中如何序列化?
        JSON.stringify()  # 序列化
        JSON.parse()      # 反序列化

        **在形参和实参中的用法不一样
        from django.http import JsonResponse

        def index(request):
            # print(123)
            # return HttpResponse('ok')
            # return redirect()
            # return render()
            user_dict = {'username':'ly很帅', 'password':123}
            l = [1, 2, 3]
            # json_str = json.dumps(l, ensure_ascii=False)

            # return HttpResponse(json_str)
            # return JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})
            return JsonResponse(l,safe=False)

form表单上传文件

        上传文件注意事项:
            1. 必须是post请求
            2. enctype='multipart/form-data'

        后端:
            在request.FILES中接收文件数据,其他数据一律按照请求方式接收

        form表单可以传递的数据格式:
            1. urlencoded
            2. form-data
         # 不能提交json格式的数据

        '''提交json格式的数据:
            1. ajax
            2. 第三方工具
                postman
                apizza
        '''

        数据格式:
            1. urlencoded
            2. form-data
            3. json格式

           if request.method == 'POST':
                print(request.FILES)
                file_obj = request.FILES.get('myfile')
                print(file_obj.name)  # 文件名
                import random
                import uuid
                aa = str(uuid.uuid4()) + '.png'
                with open(aa, 'wb') as f:
                    for line in file_obj:
                        f.write(line)
            return render(request, 'upload_file.html')

CBV和FBV

        FBV: function based view
        CBV: class based view
        class IndexView(View):
            def get(self, request):
                print('get')
                return HttpResponse('get')
            def post(self, request):
                print('post')
                return HttpResponse('POST')

        #  url(r'^indexCbv/', views.IndexView.as_view()),

CBV的源码

        如何通过请求方式确定的方法?

        #############入口################################
                    def view(request, *args, **kwargs):
                    self = cls(**initkwargs)  # self = IndexView(**initkwargs)
                    # self => IndexView
                    return self.dispatch(request, *args, **kwargs)
        ##############核心方法################################
            def dispatch(self, request, *args, **kwargs):
                # GET POST  => get post
                if request.method.lower() in self.http_method_names:
                    # 反射:get set has del
                    handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
                else:
                    handler = self.http_method_not_allowed
                return handler(request, *args, **kwargs)  # get(request, *args, **kwargs)

模板语法

        1. 传值
        # 跟变量相关的都使用双括号 {{}}
        # 跟逻辑相关的都使用 {%  %}

        '''模板文件中取值一律使用点语法 . '''

        # 在模板文件里面的函数,不用加括号,会自动加括号调用, 不能传递参数

模板语法之过滤器

        # 相当于python里面的内置方法

        语法:
            {{变量|过滤器:参数}}

        过滤器有很多个,大概有六七十,我们只需要掌握5个左右
        1. length
        2. defalut
        3. date
        4. filesizeformat
        5. safe

        # 过滤器里面最大传两个参数,至少一个参数

        xss攻击
上一篇:Django版本差异


下一篇:Django(六)