一、視圖函數 一個視圖函數,簡稱視圖,是一個簡單的python函數,接收web請求並返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤等。在函數中必須寫一個request的參數,然後必須要有返回值,中間的邏輯隨便,整個函數寫在哪裡也無所謂,只要python目錄下就行,但我們 ...
一、視圖函數
一個視圖函數,簡稱視圖,是一個簡單的python函數,接收web請求並返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤等。在函數中必須寫一個request的參數,然後必須要有返回值,中間的邏輯隨便,整個函數寫在哪裡也無所謂,只要python目錄下就行,但我們預設規定,視圖函數一般都寫在每個應用下麵views.py文件里。
下麵是一個返回當前時間的視圖函數
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
紅色部分必須要有的
request為請求對象,包含了所有的請求信息
HTTPResponse,render,redirect 都是返回的方式而已
函數名是可以隨便取的,只要和url相對應就行
二、request請求對象
request是Django把請求報文中的請求行、請求頭,請求體封裝成一個對象,只要用request.屬性就可以得到相應的請求值
/* 1.request.GET 一個類似於字典的對象,包含 HTTP GET 的所有參數。詳情請參考 QueryDict 對象。 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等。 但是,如果要處理表單數據的時候,推薦還是使用 request.POST 。 4.request.path 一個字元串,表示請求的路徑組件(不含功能變數名稱)。 例如:"/music/bands/the_beatles/" 5.request.method 一個字元串,表示請求使用的HTTP 方法。必須使用大寫。 例如:"GET"、"POST" 6.request.encoding 一個字元串,表示提交的數據的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設置,預設為 'utf-8')。 這個屬性是可寫的,你可以修改它來修改訪問表單數據使用的編碼。 接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。 如果你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。 7.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 鍵。 8.request.FILES 一個類似於字典的對象,包含所有的上傳文件信息。 FILES 中的每個鍵為<input type="file" name="" /> 中的name,值則為對應的數據。 註意,FILES 只有在請求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會 包含數據。否則,FILES 將為一個空的類似於字典的對象。 9.request.COOKIES 一個標準的Python 字典,包含所有的cookie。鍵和值都為字元串。 10.request.session 一個既可讀又可寫的類似於字典的對象,表示當前的會話。只有當Django 啟用會話的支持時才可用。 完整的細節參見會話的文檔。 11.request.user(用戶認證組件下使用) 一個 AUTH_USER_MODEL 類型的對象,表示當前登錄的用戶。 如果用戶當前沒有登錄,user 將設置為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區分它們。 例如: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. user 只有當Django 啟用 AuthenticationMiddleware 中間件時才可用。 ------------------------------------------------------------------------------------- 匿名用戶 class models.AnonymousUser django.contrib.auth.models.AnonymousUser 類實現了django.contrib.auth.models.User 介面,但具有下麵幾個不同點: id 永遠為None。 username 永遠為空字元串。 get_username() 永遠返回空字元串。 is_staff 和 is_superuser 永遠為False。 is_active 永遠為 False。 groups 和 user_permissions 永遠為空。 is_anonymous() 返回True 而不是False。 is_authenticated() 返回False 而不是True。 set_password()、check_password()、save() 和delete() 引發 NotImplementedError。 New in Django 1.8: 新增 AnonymousUser.get_username() 以更好地模擬 django.contrib.auth.models.User。
1.request.get_full_path()
返回 path,如果可以將加上查詢字元串。
例如:"/music/bands/the_beatles/?print=true
2,request.is_ajax()
如果請求是通過XMLHttpRequest 發起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH 相應的首部是否是字元串'XMLHttpRequest'。
大部分現代的 JavaScript 庫都會發送這個頭部。如果你編寫自己的 XMLHttpRequest 調用(在瀏覽器端),你必須手工設置這個值來讓 is_ajax() 可以工作。
如果一個響應需要根據請求是否是通過AJAX 發起的,並且你正在使用某種形式的緩存例如Django 的 cache middleware,
你應該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應能夠正確地緩存。
*/
三、響應對象
響應對象就相當於就web請求給的web回應,響應對象主要有三種形式:HTTPResponse(),render(),redirect()
1,HTTPResponse()
from django.shortcuts import render,HttpResponse,redirect def func(request): if request.method=='GET': return HttpResponse('是get請求方式') return HttpResponse('不是get請求方式')
HTTPResponse方式只需給字元串就行
2,render()
from django.shortcuts import render,HttpResponse,redirect def login(request): if request.method=='GET': return render(request,'login.html')
return HttpResponse('Error')
後面跟兩個參數,第一個必須寫request,第二個寫上一個模板,render()會做兩個事,首先幫你找到相應的模板,讀取內容,其次是解析模板中的模板語句,最後把解析後的字元串交給HTTPResponse發給瀏覽器
3,redirect()重定向
from django.shortcuts import render,HttpResponse,redirect def login(request): if request.method=='GET': return render(request,'login.html') else: if request.POST.get('user')=='alex' and request.POST.get('pwd')=='123': return redirect('/shouye/') else: return HttpResponse('Error')
上面代碼的功能是用戶進行登錄驗證,成功後進入首頁,但是我們用的redirect()並不會在登錄成功後直接發一個首頁的HTML文件給瀏覽器,而是給瀏覽器一個首頁的地址,要求瀏覽器馬上在給我發一個剛纔我給你的首頁地址請求,然後再把首頁的HTML文件發給瀏覽器
中間有兩次請求
301和302的區別
301和302狀態碼都表示重定向,就是說瀏覽器在拿到伺服器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取 (用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B)——這是它們的共同點。 他們的不同在於。301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換為重定向之後的網址; 302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。 SEO302好於301 2)重定向原因: (1)網站調整(如改變網頁目錄結構); (2)網頁被移到一個新地址; (3)網頁擴展名改變(如應用需要把.php改成.Html或.shtml)。 這種情況下,如果不做重定向,則用戶收藏夾或搜索引擎資料庫中舊地址只能讓訪問客戶得到一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個功能變數名稱的 網站,也需要通過重定向讓訪問這些功能變數名稱的用戶自動跳轉到主站點等。 關於301與302View Code