热门标签 | 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


推荐阅读
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
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社区 版权所有