zoukankan      html  css  js  c++  java
  • django5 序列化,CBV

    ====================FBV & CBV
    FBV -> 函数

    CBV -> 类
    - dispatch
    - get获取/post提交
    ----------------应用:登录验证

    继承:
    单继承:
    # class BaseView(View):
    # def dispatch(self, request, *args, **kwargs):
    # if request.session.get('username'):
    # response = super(BaseView,self).dispatch(request, *args, **kwargs)
    # return response
    # else:
    # return redirect('/login.html')
    #
    # class IndexView(BaseView):
    #
    # def get(self,request,*args,**kwargs):
    # return HttpResponse(request.session['username'])
    写一个类继承VIEW 调用View 的dispath 函数之前做一个 session验证

    多继承:

    # 多继承方式:
    # class BaseView(object):
    # def dispatch(self, request, *args, **kwargs):
    # if request.session.get('username'):
    # response = super(BaseView,self).dispatch(request, *args, **kwargs)
    # return response
    # else:
    # return redirect('/login.html')
    #
    # class IndexView(BaseView,View):
    #
    # def get(self,request,*args,**kwargs):
    # return HttpResponse(request.session['username'])

    和上面的方法原理相同, 自己写的类BaseView不继承任何类, 然后主类 继承 自己写的类 和 View 类,BaseView中的super方法 会找到 View 中的dispath

    装饰器:

    def auth(func):
    def inner(request,*args,**kwargs):
    if request.session.get('username'):
    obj = func(request,*args,**kwargs)
    return obj
    else:
    return redirect('/login.html')
    return inner


    # @method_decorator(auth,name='get')
    class IndexView(View):

    @method_decorator(auth)
    def dispatch(self, request, *args, **kwargs):
    if request.session.get('username'):
    response = super(IndexView,self).dispatch(request, *args, **kwargs)
    return response
    else:
    return redirect('/login.html')

    @method_decorator(auth)
    def get(self,request,*args,**kwargs):
    return HttpResponse(request.session['username'])

    @method_decorator(csrf_exempt) # 无效
    def post(self,request,*args,**kwargs):
    return HttpResponse(request.session['username'])
    要注意俩点:
    1:用的
    CBV 的话 需要导入 from django.utils.decorators import method_decorator 之后@method_decorator(auth)
        放在函数名上, 如果放在类上需要加个参数 @method_decorator(auth,name='get') ,说明是 给 get函数使用
       2:但是django有个BUG 装饰器方法都会出现 CSRF问题 ,所以
        需要写一个dispath方法 直接调用VIEW里面的 dispath 进行反射@method_decorator(auth) 放在 dispath上面


    -----------------------------------序列化
    方式一:
    user_list = models.UserInfo.objects.all()
    data = serializers.serialize("json", user_list)
    [
    {"model": "app01.userinfo", "pk": 1, "fields": {"username": "u5174u666e", "password": "123123"}},
    {"model": "app01.userinfo", "pk": 2, "fields": {"username": "u94f6u79cbu826f", "password": "666"}}
    ]

    由于json.dumps 不能对 QuerySet 类型进行处理, 所以 要使用 serializers.serialize ;但是处理结果往往不太理想


    方式二:

    user_list = models.UserInfo.objects.values('id','username')
    user_list = list(user_list)
    data = json.dumps(user_list)
    [
    {"username": "u5174u666e", "id": 1},
    {"username": "u94f6u79cbu826f", "id": 2}
    ]
      所以我们可以 用list 将QuerySet 类型转变为List类型

    问题:对json.dumps做定制:

      如果要json的列表中有不能处理的字段类型,比如datetime,date
      那么就需要帮它们转换一下,
      在json.dumps 的命令中 可以多增加一个参数,cls=一个类
      这个类继承 json.JSONEncoder,如下

    import json
    from datetime import date
    from datetime import datetime

    class JsonCustomEncoder(json.JSONEncoder):
    def default(self, field):
    if isinstance(field, datetime):
    return field.strftime('%Y-%m-%d %H:%M:%S')
    elif isinstance(field, date):
    return field.strftime('%Y-%m-%d')
    else:
    return json.JSONEncoder.default(self, field)


    user_list = [
    {'id':1,'name':'alex','ctime': datetime.now()},
    {'id':2,'name':'eric','ctime': datetime.now()}
    ]

    data = json.dumps(user_list,cls=JsonCustomEncoder)
    print(data)
    就可以帮助我们处理 datetime,date类型了,其他类型,当然也可以,修改类里面就ok


    总结:
    - 模板渲染
    - Ajax
    - json序列化
    - 前端:js添加到页面















  • 相关阅读:
    Java中变量的使用规则
    Java中的数据类型
    如何命名Java变量
    thinkphp3.2 验证码生成和点击刷新验证码
    workerman
    jorgchart,帮助你生成组织结构图的
    PHP代码获取客户端IP地址经纬度及所在城市
    百度API城市代码CityCode官方文档
    自定义过滤器
    内置过滤器
  • 原文地址:https://www.cnblogs.com/onda/p/7509053.html
Copyright © 2011-2022 走看看