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