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": "\u5174\u666e", "password": "123123"}},          {"model": "app01.userinfo", "pk": 2, "fields": {"username": "\u94f6\u79cb\u826f", "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": "\u5174\u666e", "id": 1},          {"username": "\u94f6\u79cb\u826f", "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添加到页面



				
时间: 2024-10-05 17:37:28

django5 序列化,CBV的相关文章

drf框架 ----- 接口 cbv生命周期 请求\解析\响应组件 序列化组件 三大认证 其他组件

drf框架 全称: django-rest framework (framework:框架) 理论知识点 大纲 接口 接口: 联系连个物质的媒介, 完成信息交互 web程序中 : 联系前台页面与后台数据库的媒介 web 接口的组成 : url: 统一资源定位符 长得像返回数据的链接 请求参数: 前台按照指定的key 提供数据给后台 响应数据: 后台与数据库交互后将数据反馈给前台 restful接口规范 接口规范:就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据 如何写接口:接口规范

第三章 restframework——序列化组件

第三章 restframework--序列化组件 一.django自带的序列化组件serializers 二.restframework的序列化组件Serializer 三.restframework的序列化组件ModelSerializer 四.restframework的序列化组件请求数据校验和保存功能(钩子) 五.restframework的序列化组件源码分析 一.django自带的序列化组件serializers from django.core import serializers d

DRF的序列化

DRF视图 APIview django中写CBV的时候是继承View,而rest_framework继承的是APIView,那么他们两个有什么不同 urlpatterns = [ url(r'^book$', BookView.as_view()), url(r'^book/(?P<id>\d+)$', BookEditView.as_view()), ] 不管是View还是APIView最开始调用的都是as_view()方法,看源码有什么区别 我们能看到,APIView继承了View, 并

Serializers 序列化组件

为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化. 接下来我们看下django序列化和rest_framework序列化的对比~~ Django的序列化方法 # 第一版 用values以及JsonResponse实现序列化(发现就简单的数据拿出来还这么费劲) class BookView(View): def get(self,

$Django 序列化组件

1 序列化组件 from app01 import models from rest_framework import serializers from rest_framework.serializers import Serializer,ModelSerializer from django.http import JsonResponse class auth(Serializer): name=serializers.CharField() age=serializers.CharFi

Django之View + django-rest-framework序列化

demo目录 RestDemo ├── App │ ├── admin.py │ ├── apps.py │ ├── init.py │ ├── migrations │ ├── models.py ------------------------------------------------数据模型 │ ├── serializers.py ------------------------------------------------序列化模块 │ ├── tests.py │ ├── u

django rest_framework Serializers 序列化组件

为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化. 接下来我们看下django序列化和rest_framework序列化的对比~~ Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objects.values("id&quo

Restful framework【第三篇】序列化组件

基本使用 -序列化 -对象,转成json格式 用drf的序列化组件 -定义一个类继承class BookSerializer(serializers.Serializer): -写字段,如果不指定source,字段名必须跟数据库字段名对应(source指定的值跟字段名不能重复) -source还可以指定方法 -publish=serializers.SerializerMethodField() def get_publish(self,obj): obj.publish #obj.author

Django的restframework序列化多表字段的方法

首先,因为我们安装了restframework,所以我们需要在django的settings中引入restframework INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app1.