1. 程式人生 > >django5 序列化,CBV

django5 序列化,CBV

直接 找到 cor nco response 我們 應用 ase 模板

====================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添加到頁面















django5 序列化,CBV