====================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