django-視圖層
阿新 • • 發佈:2018-11-08
line fbv ctype spa put 替換 request對象 sub 瀏覽器
########視圖層######## 視圖層其實就是寫一系列的邏輯代碼的視圖函數 1、講講HttpResponse對象 render, HttpResponse, redirect這是我們用到最多三中方法 其實每次返回給前臺的數據都是一個HttpResponse對象。 return HttpResponse(‘你好‘) ----> 向前臺發送 你好 return render(request,‘index.html‘,{‘name‘:name}) ----> 將模板渲染好了,返回給前臺頁面return redirect(‘/index/‘) ----> 重定向作用 render : 首先他將模板index.html先讀取出來,當讀取到django的模板語法時,執行,在{‘name‘:name}拿數據替換 替換完畢了,返回一個HttpResponse對象給前臺 from django.template import Template,Context def test(request): temp = Template(‘<h1>{{ name }}</h1>‘) con = Context({‘name‘:‘zhuyu‘}) ret = temp.render(con) return HttpResponse(ret) redirect:重定向流程:瀏覽器先向服務端發出請求---->服務端接收到請求並響應回去,這是響應回去攜帶數據(以3開頭的狀態碼,和 需要重定向的url---->瀏覽接收到服務端的響應,看到是3開頭的狀態碼,就像攜帶過來的url再去發出請求---->服務端接 收到請求,並響應給瀏覽器----->瀏覽器接收到響應,看到狀態碼是200,就把響應體內的內容在頁面是顯示。) 2、講講JsonResponse對象(一看就知道,就是給前臺返回json格式的數據) from django.http import JsonResponse 假如我不用JsonResponse,也可以向前臺傳json格式數據 import json dic = {‘name‘:‘zhuyu,‘age‘:21} return HttpResponse(json.dumps(dic)) 通過上面的方法是可行的,但我直接用jsonResponse就不需要自己手動轉成json中間格式 return JsonResponse(dic) #它的內部就是用上面的方法實現的,可能有點點差距 lis = [‘zhuyu‘,18] return JsonResponse(lis) #這樣是會報錯的,你點進去查看該源碼,會發現有safe參數,它默認為True #這裏你把safe改為False,就可以將其他格式轉換成json中間格式了 return JsonResponse(lis,safe=False) #不會報錯 3、CBV和FBV CBV------->通過類去處理請求 FBV------->通過函數去處理請求 FBV就不用說了吧,之前的都是用FBV寫的視圖函數 下面寫寫CBV怎麽處理前端過來的請求: from views import View class Index(View): #必須繼承View才可以,和前面orm必須繼承models.Model是一樣的。 def get(self,request): return HttpResponse(‘get請求我來處理‘) def post(self,request): return HttpResponse(‘post請求我來處理‘) #在視圖層寫好了,必須要在路由層去配置關系 urlpatterns = [ url(r‘^index/‘,views.Index.as_view()) ] #配置完了,就可以通過瀏覽訪問改路徑了:你是get請求就會走到視圖層該類裏的get方法,post請求就會走到post方法 #為什麽這樣子呢?當然是django給你封裝了,views.Index.as_view() 它的返回值就是函數的內存地址。自己看源碼 #吧,它是怎麽運行的。 4、簡單的文件上傳 記住:前端過來的請求攜帶的所有數據,我們都可以通過request去拿到。request就是wsgiref那裏將數據處理,封裝成 一個對象,並傳遞過來。 下面寫寫request對象裏的一些方法屬性吧 request.method #請求的方式 request.POST #post請求,form表單的數據,這是一個QueryDict對象,它是繼承字典,所以可以用字典取值方法 request.GET #和post一樣,不過它是將get請求攜帶的數據放這裏面,也是QueryDict對象 request.META #將請求頭的信息放這裏 request.body #post請求,請求體裏的內容,這裏是沒有進行處理的,bytes類型 request.FIlES #上傳文件的內容,他也是個對象,一樣繼承了字典,取值的方法你也應該知道了吧 request.path #請求的url 好了,了解到了這裏,寫寫文件上傳 首先你需要一個html頁面(偽代碼了): html代碼: <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="提交"> </form> 視圖層: def aaa(request): if request.method == ‘POST‘: file = request.FILES.get(‘file‘) filename = file.get(‘name‘) with open(filename,‘wb‘) as f: for line in file: f.write(line) return HttpResponse(‘ok‘) 提醒下:這裏的file是一個文件的對象,,和 f= open(‘a.txt‘) 中的f差不多 也是可以叠代的。 這裏補充一點:假如 dic = {‘name‘: ‘朱宇‘, ‘male‘: ‘男‘} dic = json.dumps(dic) print(dic) 打印結果為:{"name": "\u6731\u5b87", "male": "\u7537"} 這是json函數中有個默認參數ensure_ascii,默認是為True,默認是ascii編碼,你把True改為False就行了 dic = json.dumps(dic,ensure_ascii=False) print(dic) 這樣你的打印才是 {"name": "朱宇", "male": "男"} 那我們用JsonResponse()時該怎麽去使用呢? JsonResponse(dic,json_dumps_params={‘ensure_ascii‘: False})
django-視圖層