一個視圖函數是一個簡單的python函數,它接受Web請求並返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向、一個404錯誤或一張圖片。html
視圖層應掌握兩個對象:請求對象(request)和 響應對象(HttpResponse)前端
form表單,不寫method,默認是get請求python
(1)什麼狀況下用get:請求數據,請求頁面django
(2)什麼狀況下用post:向服務器提交數據json
掌握:
1.request.GET
一個相似於字典的對象,包含 HTTP GET 的全部參數。
2.request.POST 一個相似於字典的對象,若是請求中包含表單數據,則將這些數據封裝成 QueryDict 對象。 POST 請求能夠帶有空的 POST 字典 —— 若是經過 HTTP POST 方法發送一個表單,可是表單中沒有任何的數據,QueryDict 對象依然會被建立。 所以,不該該使用 if request.POST 來檢查使用的是不是POST 方法;應該使用 if request.method == "POST" 另外:若是使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。 注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要用: request.POST.getlist("hobby") 3.request.body 一個字符串,表明請求報文的主體。在處理非 HTTP 形式的報文時很是有用,例如:二進制圖片、XML,Json等。 可是,若是要處理表單數據的時候,推薦仍是使用 HttpRequest.POST 。 4. 路徑:http://127.0.0.1:8000/index/xxxx/?name=hanl&password=123
request.path
一個字符串,表示請求的路徑組件(不含域名、內容) /index/xxxx/
request.get_full_path() 表示全路徑(包含內容) /index/xxxx/?name=hanl&password=123
5.request.method (請求類型) 一個字符串,表示請求使用的HTTP 方法。必須使用大寫。 例如:"GET"、"POST"
7.request.FILES(*****) 一個相似於字典的對象,包含全部的上傳文件信息。 FILES 中的每一個鍵爲<input type="file" name="" /> 中的name,值則爲對應的數據。 注意,FILES 只有在請求的方法爲POST 且提交的<form> 帶有enctype="multipart/form-data" 的狀況下才會 包含數據。不然,FILES 將爲一個空的相似於字典的對象。
-----------------------------------------------------------------------------------------------------
瞭解:
8.request.META 一個標準的Python 字典,包含全部的HTTP 首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例: 取值: CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。 CONTENT_TYPE —— 請求的正文的MIME 類型。 HTTP_ACCEPT —— 響應可接收的Content-Type。 HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。 HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。 HTTP_HOST —— 客服端發送的HTTP Host 頭部。 HTTP_REFERER —— Referring 頁面。 HTTP_USER_AGENT —— 客戶端的user-agent 字符串。 QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。 REMOTE_ADDR —— 客戶端的IP 地址。 REMOTE_HOST —— 客戶端的主機名。 REMOTE_USER —— 服務器認證後的用戶。 REQUEST_METHOD —— 一個字符串,例如"GET" 或"POST"。 SERVER_NAME —— 服務器的主機名。 SERVER_PORT —— 服務器的端口(是一個字符串)。 從上面能夠看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 以外,請求中的任何 HTTP 首部轉換爲 META 的鍵時, 都會將全部字母大寫並將鏈接符替換爲下劃線最後加上 HTTP_ 前綴。 因此,一個叫作 X-Bender 的頭部將轉換成 META 中的 HTTP_X_BENDER 鍵。 6.request.encoding 一個字符串,表示提交的數據的編碼方式(若是爲 None 則表示使用 DEFAULT_CHARSET 的設置,默認爲 'utf-8')。 這個屬性是可寫的,你能夠修改它來修改訪問表單數據使用的編碼。 接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。 若是你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。
9.request.COOKIES 一個標準的Python 字典,包含全部的cookie。鍵和值都爲字符串。
響應對象主要有三種方式:瀏覽器
HttpResponse()括號內直接跟一個具體的字符串做爲響應體服務器
render(request, template_name[, context])
如:render(request,'book_list.html',{'book_list':book_list})
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
參數:cookie
request: 用於生成響應的請求對象。
template_name:要使用的模板的完整名稱,可選的參數
context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它。
render方法就是將一個模板頁面中的模板語法進行渲染,最終渲染成一個html頁面做爲響應體。
重定向
redirect(‘/index/’)
也能夠是一個完整的URL:
redirect('http://www.baidu.com/')
重定向301和302的區別:
都表示重定向,就是瀏覽器在拿到服務器的這個狀態碼後會自動跳轉到一個新的URL
(用戶看到的效果就是他輸入的地址A瞬間變成了另外一個地址B)——這是它們的共同點。
他們不一樣在於:
301表示就地址A的資源已經被永久移除(這個資源不能夠訪問了),
搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向以後的網址;
302表示舊地址A的資源還在(仍然能夠訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓 取新的內容而保存舊的網址。
想前端返回一個json格式字符串的兩種方式:
方式一:
dic={'name':'byz','age':18} li=[1,2,3,4] return HttpResponse(json.dumps(li))
方式二: from django.http import JsonResponse
dic={'name':'byz','age':18}
return JsonResponse(dic,safe=False)
CBV基於類的視圖(Class base view)和FBV基於函數的視圖(Function base view)函數
from django.views import View class AddPublish(View): def dispatch(self, request, *args, **kwargs): print(request) print(args) print(kwargs) # 能夠寫相似裝飾器的東西,在先後加代碼 obj=super().dispatch(request, *args, **kwargs) return obj def get(self,request): return render(request,'index.html') def post(self,request): request return HttpResponse('post')
1 <form action="" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="name"> 密碼:<input type="text" name="password"> 文件:<input type="file" name="myfile"> <input type="submit"> </form> #enctype="multipart/form-data"*******************重點 #<input type="file" name="myfile">****必定要指定name 2 # ff是一個文件對象,django封裝的 ff=request.FILES.get('myfile') # 文件對象的名字 file_name=ff.name from django.core.files.uploadedfile import InMemoryUploadedFile print(type(ff)) with open(file_name,'wb') as f: for line in ff.chunks(): f.write(line) return HttpResponse('ok)