視圖層
1、視圖函數
一個視圖函數,簡稱視圖,是一個簡單的Python 函數,它接受Web請求而且返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西均可以。不管視圖自己包含什麼邏輯,都要返回響應。html
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect import datetime // 視圖函數current_datetime使用HttpRequest對象做爲第一個參數,而且一般稱之爲request def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now // 視圖會返回一個HttpResponse對象,其中包含生成的響應。每一個視圖函數都負責返回一個HttpResponse對象 return HttpResponse(html)
b request s r -----------------> e o <----------------- r w response ve
2、視圖層之HttpRequest對象
django將請求報文中的 請求行、首部信息、內容主體 封裝成 HttpRequest 類中的屬性。 除了特殊說明的以外,其餘均爲只讀的前端
# 1.前臺Post傳過來的數據,包裝到POST字典中 request.POST # 2.前臺瀏覽器窗口裏攜帶的數據,包裝到GET字典中 request.GET # 3.前臺請求的方式 request.method # 4.post提交的數據,body體的內容,前臺會封裝成:name=lqz&age=18&sex=1 request.body # 5.取出請求的路徑,取不到數據部分 request.path # /test/blog/ # 6.取出請求的路徑,能取到數據部分 request.get_full_path() # /test/blog?id=1&name=tom # 7.META,一個標準的Python 字典,包含全部的HTTP 首部 request.META # 8.一個相似於字典的對象,包含全部的上傳文件信息 request.FILES #FILES 中的每一個鍵爲<input type="file" name="" /> 中的name,值則爲對應的數據。 # 注意,FILES 只有在請求的方法爲POST 且提交的<form> 帶有enctype="multipart/form-data" 的狀況下才有 # 包含數據。不然,FILES 將爲一個空的相似於字典的對象。
3、視圖層之HttpResponse對象
響應對象主要有三種形式:python
HttpResponse() render() redirect()
一、render()
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象django
render(request, 'index.html'[,context]) # 第一個參數是用於生成相應的的請求對象,第二個參數是要使用的模板的名稱,第三個參數是添加到模板上下文的字典
# render方法就是將一個模板頁面中的模板語法進行渲染,最終渲染成一個html頁面做爲響應體,render函數至關於 temp=Template('<h1>{{ user }}</h1>') con=Context({'user':'lqz'}) ret=temp.render(con) print(ret) # return render(request,'index.html') return HttpResponse(ret)
二、redirect()
傳遞要重定向的一個硬編碼的URLjson
def test(request): ... #return redirect('/showbooks/') return redirect('http://127.0.0.1:8888/showbooks')
4、視圖層之JsonResponse對象
from django.http import JsonResponse def test(request): dic = {'id':1,'name':'tom'} # JsonResponse默認只支持字典 return JsonResponse(dic) # 等價於 import json def test(request): dic = {'id':1,'name':'tom'} return HttpResonse(json.dumps(dic))
- JsonResponse默認只支持字典
- 要用其餘類型,能夠將JsonResponse參數中的safe設爲False,即 return JsonResponse(list, safe=False)
5、CBV和FBV
CBV基於類的視圖(Class base view)和FBV基於函數的視圖(Function base view)瀏覽器
一、CBV(基於類的視圖)
# 路由層 url(r'test/', views.Test.as_view()) # 後面視圖必須加括號,源碼中是返回一個內存地址 # 視圖層 # 1.導入view from django.views import View # 2.寫類 class Test(view): # 必須繼承view def get(self, request): # 方法名字必須爲get、post,參數中必需要有request return HttpResponse('get_test') def post(self, request): return HttpResponse('post-test')
二、FBV(基於函數的視圖)
# 路由層 url(r'test/', views.show) # 視圖層 def show(request): return HttpResponse('showbooks')
6、文件上傳
一、前端
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="text" name="password"> <input type="submit" value="提交"> </form>
- 編碼enctype用 ‘ multipart/form-data ’
二、後臺,文件上傳,存到本地
def fileupload(request): if request.method=='GET': return render(request,'fileupload.html') if request.method=='POST': # 從字典里根據名字,把文件取出來 myfile=request.FILES.get('myfile') # 文件名字 name=myfile.name # 打開文件,把上傳過來的文件存到本地 with open(name,'wb') as f: # for line in myfile.chunks(): for line in myfile: f.write(line) return HttpResponse('ok')