热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

十三、FBV和CBV和数据序列化

FBV代表func,也就是函数。CBV代表class,也就是类应用场景:登录验证.FBV写法:deflogin(request):dic{tag:N

FBV代表func,也就是函数。
CBV代表class,也就是类
应用场景:登录验证.


FBV写法:

def login(request):dic = {'tag':None,'data':None,'status':True}if request.method == 'GET':# 第一次登陆跳转到登陆return render(request,'login.html')else:#当取不到值的时候返回falseUsername = request.POST.get('username',False)Password = request.POST.get('password',False)# print ('username:',username)# print ('password:',password)if not Password or not Username:ret_data = json.dumps(dic) #把字典转化为字符串,然后进行返回return HttpResponse(ret_data)else:#去数据库匹匹配账户密码user_obj = models.Userinfo.objects.filter(username=Username,password=Password)if user_obj.first():#登录成功#return HttpResponse("欢迎来到我的世界")#将user_obj转化为json格式的数据。json_data = serializers.serialize('json',user_obj)dic['data'] = json_data# 设置session内部的字典内容request.session['is_login'] = user_obj.first().namerequest.session['username'] = Usernamereturn HttpResponse(json.dumps(dic))#登录成功就跳转到后台页面#return redirect("/page")#return redirect('/session')else:return HttpResponse("账号密码错误")

CBV写法:

例如我们正常登类为index,验证类为auth,登录类为Login,我们用index类,继承auth类,就可以实现验证登录,然后验证失败就调用Login类,

逻辑view写法:
from django.views import View
from django.core import serializersclass Login(View):def get(self,request):#第一次访问return render(request,'login.html')def post(self,request):dic = {'tag': None, 'data': None, 'status': True}Username = request.POST.get('username', False)Password = request.POST.get('password', False)if not Password or not Username:ret_data = json.dumps(dic) # 把字典转化为字符串,然后进行返回return HttpResponse(ret_data)else:# 去数据库匹匹配账户密码user_obj = models.Userinfo.objects.filter(username=Username, password=Password)if user_obj.first():#给session字典赋值request.session['login'] = user_obj.first().namereturn redirect('/index_demo')else:return HttpResponse("账号密码错误")
class Auth(View):def dispatch(self, request, *args, **kwargs):#有session固定写法,获取Login登录时候的session的key值if request.session.get('login'):response = super(Auth,self).dispatch(request, *args, **kwargs)return responseelse:return redirect('/login_demo')
#继承Auth ,Index就不能直接访问了,需要登录验证
class Index(Auth):def get(self,request):return HttpResponse('Index')

路由url.py中添加:

url(r'^login_demo', views.Login.as_view()),
url(r'^index_demo', views.Index.as_view()),

测试:
此时启动访问http://127.0.0.1:8080/index_demo,因为没有session,所以不能直接访问,会跳转到login登录界面,登录以后才能直接访问


序列化:

所谓序列化就是对数据格式转化为json格式
由于json.dumps 不能对 QuerySet 类型进行处理, 所以 要使用 serializers.serialize
我们导入serialize 库,然后再操作数据

from django.core import serializersif user_obj.first():#登录成功#return HttpResponse("欢迎来到我的世界")#将user_obj转化为json格式的数据。json_data = serializers.serialize('json',user_obj)dic['data'] = json_data

结果:

在这里插入图片描述
如果操作的数据类型是date,datetime的话,那么就需要帮它们转换一下,在json.dumps 的命令中 可以多增加一个参数,cls=一个类,这个类继承 json.JSONEncoder,如下
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

from datetime import datetime
#!/usr/bin/env python
import json
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)

结果:

[root@master config]# python cvb.py
[{"ctime": "2018-12-30 13:37:29", "id": 1, "name": "alex"}, {"ctime": "2018-12-30 13:37:29", "id": 2, "name": "eric"}]

这样就可以帮助我们处理 datetime,date类型了,其他类型,当然也可以,修改类里面就ok


推荐阅读
author-avatar
小鱼儿r6K2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有