視圖函數必需要返回一個HttpResponse對象html
向前端返回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
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')
視圖函數並不必定就是函數,也能夠是類,django的視圖層由兩種形式構成:FBV和CBV函數
FBV:基於函數的視圖源碼分析
CBV:基於類的視圖post
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,
看源碼發現是綁定給類的方法。下面是源碼分析