1. 程式人生 > 實用技巧 >django檢視系統

django檢視系統

request物件

常用屬性和方法

print(request)  #wsgirequest物件
    print(request.path) #請求路徑 #/index/
    print(request.method) #請求方法
    print(request.POST) #post請求提交的資料 <QueryDict: {'username': ['root']}>
    print(request.GET) # 獲取url中的查詢引數 <QueryDict: {'a': ['1'], 'b': ['2']}>  #不是針對get請求的
    print
(request.body) #獲取htt p請求訊息格式的請求資料部分的內容 b'' print(request.META) #請求頭資訊 print(request.get_full_path()) #獲取完整路徑(包含查詢引數的) /index/?a=1&b=3 print(request.FILES) # 上傳的檔案物件資料 print(request.FILES.get('file')) #26機試.pdf #<QueryDict: {'username': ['root'], 'sex': ['female'], 'hobby': ['2', '3']}>
print(request.POST.get('username')) #zhen print(request.POST.get('gender')) #female # 多選提交來的資料通過getlist來獲取 print(request.POST.getlist('hobby')) #['2', '3']

response響應

常用方法

from django.shortcuts import render, HttpResponse, redirect

return HttpResponse('你好') #回覆字串
return render(request,'
home.html') #回覆html頁面 #重定向方法,引數是個路徑 return redirect('/home/') #封裝了302狀態碼,以及瀏覽器要重定向的路徑

新增響應頭鍵值對

ret = render(request,'home.html') 
ret['a'] = 'b' #新增響應頭鍵值對

return ret

新增響應狀態碼

ret = render(request,'home.html', status=202) #render修改狀態碼還可以這樣改
#ret['a'] = 'b' #新增響應頭鍵值對
ret.status_code = 201 #新增響應狀態碼
return ret #回覆html頁面

CBV和FBV

兩種檢視邏輯的寫法方法

FBV:全稱function based view,就是基於函式來寫檢視邏輯

CBV:全稱class based view,就是基於類來寫檢視

基於函式的寫法,寫了很多了,這裡不放示例了

基於類的檢視寫法,如下,views.py檔案

from django.views import View

#登入需求
class LoginView(View):
    # get請求  獲取login頁面
    def get(self,request):
        return render(request,'login.html')
    # post請求,獲取post請求提交的資料,並校驗等等

    def post(self,request):
        print(request.POST)
        
        #<QueryDict: {'uname': ['chao'], 'pwd': ['123']}>
        return render(request,'login.html')

url路徑的寫法:urls.py檔案

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
    url(r'^home/', views.home),

    # 類檢視的url寫法
    url(r'^login/', views.LoginView.as_view()),

]

cbv原始碼重點(反射)

from django.views import View
View裡面的dispatch方法中的反射邏輯,實現了不同的請求方法,找到我們檢視類中的對應方法執行

FBV和CBV加裝飾器:三種方式

FBV和普通函式加裝飾器方式一樣

示例:

#裝飾器函式
def outer(f):
    def inner(request, *args ,**kwargs):
        print('前面')
        ret = f(request, *args ,**kwargs)
        print('後面')
        return ret
    return inner

#使用裝飾器
@outer
def books(request):
    print('FBV執行了')
    return HttpResponse('book.html--ok')

CBV加裝飾器

#裝飾器函式
def outer(f):
    def inner(request, *args ,**kwargs):
        print('前面')
        ret = f(request, *args ,**kwargs)
        print('後面')
        return ret
    return inner


#使用裝飾器
#1 引入django提供的裝飾器方法method_decorator來配合裝飾器函式的使用
from django.utils.decorators import method_decorator

@method_decorator(outer,name='get') #CBV加裝飾器方式3
class BookView(View):
    #給類方法統一加裝飾器,藉助dispatch方法(父類的dispatch方法,就是通過反射來完成不同的請求方法找到並執行我們自己定義的檢視類的對應方法)
    # 重寫dispatch方法,dispatch方法是在其他請求方法對應的類方法執行之前執行的
    # @method_decorator(outer) #加裝飾器方式2
    def dispatch(self, request, *args, **kwargs):
        # print('xxxxxx')
        ret = super().dispatch(request, *args, **kwargs)
        # print('oooooo')
        return ret

    #CBV加裝飾器的方式1,給單獨的方法加裝飾器
    # @method_decorator(outer)
    def get(self, request, xx):
        print('CBV的get方法')
        return render(request, 'book.html')

    # @method_decorator(outer)
    def post(self,request, xx):
        print('CBV的post方法')
        return HttpResponse('ok')