Django之視圖層

視圖函數必需要返回一個HttpResponse對象html

JsonResponse對象

向前端返回Json格式的字符串前端

from django.http import JsonResponse
import json
def xxx(request): user_dict = {'username':'你好帥,我好喜歡!','password':'123'} # json_str = json.dumps(user_dict,ensure_ascii=False) # return HttpResponse(json_str) l = [1,2,3,4,5,6,7,8,9,] # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False}) return JsonResponse(l,safe=False) # 序列化非字典格式數據 須要將safe改成False

Form表單上傳文件

upload.htmldjango

 view.pyjson

def upload(request): if request.method == 'POST': #獲取用戶上傳的文件數據
        print(request.FILES) file_obj = request.FILES.get('myfile')  #能夠把file_obj看做是一個文件句柄
        print(file_obj.name) #獲取文件名
        with open(file_obj.name,'wb')as f: for line in file_obj: f.write(line) return render(request,'upload.html')

FBV和CBV

視圖函數並不必定就是函數,也能夠是類,django的視圖層由兩種形式構成:FBV和CBV函數

FBV:基於函數的視圖源碼分析

CBV:基於類的視圖post

CBV基本寫法

urls.pyurl

url(r'^login/', views.MyLogin.as_view())

views.pyspa

from django.views import View

class MyLogin(View):
    def get(self,request):
        return render(request,'login.html')
    def post(self,request):
        return HttpResponse('我是類裏面的post方法')

# 咱們會發現,朝login提交get請求會自動執行MyLogin裏面的get方法
# 而提交post請求會自動執行MyLogin裏面的post方法

基於以上發現,咱們想想,爲何MyLogin針對不一樣的請求方法可以自動執行對應的方法,咱們能夠來看下源碼。研究源碼的突破口就是code

url(r'^login/', views.MyLogin.as_view()) 
#FBV與CBV在路由匹配上本質是同樣的,都是路由與函數內存地址的對應關係

猜測,as_view要麼是類裏面定義的普通函數 @staticmethod

要麼是類裏面定義的綁定給類的方法 @classmethod,

看源碼發現是綁定給類的方法。下面是源碼分析

相關文章
相關標籤/搜索