django FBV +CBV 視圖處理方式總結

 

一、FBV(function base views)html

在視圖裏使用函數處理請求。django

 

url:
        re_path('fbv', views.fbv),
        # url(r'^fbv', views.fbv),cookie

 

func:
        def fbv(requset):
                return render(requset,'fbv_Cbv.html')函數

 

二、CBV (class base views)post

url:url

re_path('cbv', views.Cbv.as_view()),
# url(r'^cbv', views.Cbv.as_view()),spa

 


class:orm

from django.views import View
#導入View模塊
class Home(View):  #使用類處理須要繼承View(view是Home的父類,Home是子類)  
        def get(self,request): #自動識別,若是用戶請求方式:get,那麼自動調用該方法執行結果
                print(request.method)
                return render(request, 'home.html')

      def post(self,request):
             print(request.method)#自動識別,若是用戶請求方式:post,那麼自動調用該方法執行結果
            return render(request, 'home.html')

htm

三、FBV+CBV 獲取數據、返回數據的命令參數繼承

    A.獲取數據的幾種方式
        request.method
        request.GET
        request.POST
        request.FILES
        request.path_info
        request.COOKIES
        reqeust.body    #全部內容的原生數據

  B.獲取checkbox等多選的內容
        request.POST.getlist()
        request.GET.getlist()

        #因此分紅兩類
        request.body  #用戶請求的原生數據,以字符串形式存放

        request.PUT
        request.DELECT
        request.MOVE
       #django對上面3種沒有作處理,因此咱們操做以上3種的時候就須要經過request.body獲取原生數據:字符串形式

      request.Meta
       #出了數據外,請求頭相關的信息,如:判斷用戶是PC端仍是移動端

       request.method(POST、GET、PUT..)
       request.path_info
       request.COOKIES

 

  C.接收上傳文件,注意:模板文件html的form標籤必須作特殊設置:enctype="multipart/form-data"
        obj = request.FILES.get('file')
        obj.name    #取該文件名
        obj.size       #取該文件的字節大小
        obj.chunks  #取該文件的塊


        file_path = os.path.join('%s\\upload'%os.path.dirname(os.path.abspath(__file__)), obj.name)  #當前文件的目錄下的upload目錄和接收文件名進行拼接成文件路徑
        f = open(obj.name,mode= 'wb') #若是該路徑文件存在就打開,不存在就建立
        for item in obj.chunks():
            f.write(item) #寫入文件
        f.close()     #關閉文件
            
 D、返回給用戶的幾種方式                  

           
        return render(request,'模板路徑.html',{'list':[1,2,3,4],'dict': {'k1':'v1','k2':'v2'} })  #返回給用戶指定通過模板渲染後的html
        retune redirect(’url路徑’)        #跳轉到指定url
        retune HttpResponse(‘字符串’)  #直接返回給用戶字符串

       response = HttpResponse(a)
       response.set_cookie(‘key’:’value’)  #設置客戶端cookie
       response[‘name’] = ‘bur’   #設置客戶端響應頭
       return response

 

 

四、FBV+CBV 添加驗證裝飾器

A、FBV添加裝飾器

 

def auth(func):
def deco(request, *args, **kwargs):
u = request.get_signed_cookie('username', salt='user', default=None)
if not u:
return render(request, 'login.html')
return func(request, *args, **kwargs)
return deco

@auth
def index(request):
u = request.get_signed_cookie('username', salt='user', default=None)
return render(request, 'index.html', {'user': u})

@auth
def detail(request):
u = request.get_signed_cookie('username', salt='user', default=None)
return render(request, 'detail.html', {'user': u})

訪問index/detail時,調用auth裝飾器,若是驗證成功,則執行index/detail(return func(request, *args, **kwargs)語句起的做用);
不然跳轉到login.html

 

B、CBV方式添加裝飾器:經過django自帶的裝飾器method_decorator 的@method_decorator(cookie)來實現

 

from django.utils.decorators import method_decorator
from django import views

# @method_decorator(cookie,name='dispatch') # dispatch的便捷寫法
class CBVtest(views.View):
@method_decorator(cookie) # 給dispatch方法添加裝飾器,那麼下面全部的get,post都會添加
def dispatch(self, request, *args, **kwargs):
return super(CBVtest, self).dispatch(request, *args, **kwargs)

# @method_decorator(cookie) # 單獨添加
def get(self, request):
u = request.get_signed_cookie('username', salt='user', default=None)
return render(request, 'houtai.html', {'user': u})

def post(self, request):
return HttpResponse('post ok')
相關文章
相關標籤/搜索