1. 程式人生 > >django-視圖層

django-視圖層

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-視圖層