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

本文对比了函数视图(FBV)和类视图(CBV)在Django框架中实现登录验证的不同方式,详细展示了两种方法的具体代码实现,并解释了序列化过程,适合初学者理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:
        #当取不到值的时候返回false
        Username = 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().name
                request.session['username'] = Username
                return 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 serializers

class 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().name
                return 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 response
            else:
                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 serializers

if 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值