request
如果說 urls.py 是 Django 中前端頁面和后台程序橋梁,那么 request 就是橋上負責運輸的小汽車
可以說后端接收到的來至前端的信息幾乎全部來自於requests中。
request對象的屬性
request.META
request.MATE獲取的是一個標准的python字典。它包含了所有的HTTP請求信息
1 CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。
2 CONTENT_TYPE —— 請求的正文的MIME 類型。
3 HTTP_ACCEPT —— 響應可接收的Content-Type。
4 HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。
5 HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。
6 HTTP_HOST —— 客服端發送的HTTP Host 頭部。
7HTTP_REFERER —— Referring 頁面。
8 HTTP_USER_AGENT —— 客戶端的user-agent 字符串。
9 QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。
10 REMOTE_ADDR —— 客戶端的IP 地址。
11 REMOTE_HOST —— 客戶端的主機名。
12 REMOTE_USER —— 服務器認證后的用戶。
13 REQUEST_METHOD —— 一個字符串,例如”GET” 或”POST”。
14 SERVER_NAME —— 服務器的主機名。
15 SE0RVER_PORT —— 服務器的端口(是一個字符串)
獲取請求的源主機:HttpRequest.get_host()
request.scheme
請求的方式,即http或者是https
request.path
請求的路徑,這里的路徑是指相對路徑,也就是說一個登陸后台頁面的請求:http://127.0.0.1:8000/admin 的路徑是 /admin 獲取完整路徑(包括參數):HttpRequest.get_full_path() 獲取絕對url: HttpRequest.bulid_absolute_uri(location) 此參數默認為完整路徑
request.encoding
請求提交的數據的編碼方式
request.session
request.session 獲取的是一個類似於字典的對象,可以進行讀取寫入操作,常用來保存一些數據來實現會話跟蹤技術。
因為 HTTP 是一個無狀態,不連續的協議。如果想讓服務器記住當前的訪問對象,就需要記錄請求者的一些信息來達到這個目的。
# 設置session request.session["name"] = "root" # 獲取session name = request.sessin["name"]
!!!說到這里需要提一下,django會默認為session使用json序列化。json序列化只能序列化一些基本數據類型,如數字,字符串,列表等。所以session不能直接存儲對象.可以簡單的在settings中添加 SESSION_SERIALIZER = "django.contrib.sessions.serializers.PickleSerializer"
request.COOKIES
與session類似,區別是cookies數據是保存在客戶端,session數據是保存在服務端。
相對而言session更安全,cookies在不同的瀏覽器上保存數據的大小限制也不同。但是,存在即合理。cooike自有它的好處這里不多說。
# 設置cookies
response.set_cookie('name','root')
# 設置加密cookies
response.set_cookie('passsword','123456',salt='@#$!%^&')
# 獲取cookie
request.COOKIES.get("name")
# 獲取加密的cookie
request.get_signed_cookie("password",salt="@#$!%^&")
request.method
請求方式 POST/GET….
下面正式開始獲取數據
request.body
請求的主體,返回的是一個字符串
request.data
請求的數據部分,返回的是一個字典對象
(除此之外,與request.body是很類似的)
request.POST
獲取post方式表單中
提交的數據
request.POST["username"] request.POST.get("username")
request.GET
獲取get方式表單中或url
提交的數據
request.POST["username"] request.POST.get("username")
django request.POST和request.body獲取值時出現的情況

django request.POST / request.body 當request.POST沒有值 需要考慮下面兩個要求 1.如果請求頭中的: Content-Type: application/x-www-form-urlencoded request.POST中才會有值(才會去request.body中解析數據) 2.若1有,也不一定有值 必須有數據格式要求: name=alex&age=18&gender=男 如: a. form表單提交 默認就會滿足上訴的1和2 <form method...> input </form> b. ajax提交 $.ajax({ url:... type:POST, data:{ name:alex, age=18, } #默認也會滿足上訴1和2 請求頭默認為上述情況 內部數據格式會轉為上述情況 }) 自定義ajax 情況一 $.ajax({ url:... type:POST, headers:{'Content-Type':"application/json"} #不同的請求頭 導致request.POST獲取不了數據 而request.body依舊存在數據 data:{name:alex, age = 18} #內部自動轉換 name=alex&age=18 }) #即body有值 POST無值 自定義ajax 情況二 $.ajax({ url:... type:POST, headers:{'Content-Type':"application/json"} #不同的請求頭 導致request.POST獲取不了數據 而request.body依舊存在數據 data:JSON.stringfy{name:alex, age = 18} #{name:alex,age:18} }) #body有值 POST無值 #從 request.body里獲取數據 然后再通過json.loads(request.body)
HttpRequest對象
屬性
1 HttpRequest.scheme 請求的協議,一般為http或者https,字符串格式(以下屬性中若無特殊指明,均為字符串格式)
2 HttpRequest.body http請求的主體,二進制格式。
3 HttpRequest.path 所請求頁面的完整路徑(但不包括協議以及域名),也就是相對於網站根目錄的路徑。
4 HttpRequest.path_info 獲取具有 URL 擴展名的資源的附加路徑信息。相對於HttpRequest.path,使用該方法便於移植。
if the WSGIScriptAlias for your application is set to "/minfo", then path might be "/minfo/music/bands/the_beatles/" and path_info would be "/music/bands/the_beatles/".
5 HttpRequest.method 獲取該請求的方法,比如: GET POST .........
6 HttpRequest.encoding 獲取請求中表單提交數據的編碼。
7 HttpRequest.content_type 獲取請求的MIME類型(從CONTENT_TYPE頭部中獲取),django1.10的新特性。
8 HttpRequest.content_params 獲取CONTENT_TYPE中的鍵值對參數,並以字典的方式表示,django1.10的新特性。
9 HttpRequest.GET 返回一個 querydict 對象(類似於字典,本文最后有querydict的介紹),該對象包含了所有的HTTP GET參數
10 HttpRequest.POST 返回一個 querydict ,該對象包含了所有的HTTP POST參數,通過表單上傳的所有 字符 都會保存在該屬性中。
11 HttpRequest.COOKIES 返回一個包含了所有cookies的字典。
12 HttpRequest.FILES 返回一個包含了所有的上傳文件的 querydict 對象。通過表單所上傳的所有 文件 都會保存在該屬性中。
key的值是input標簽中name屬性的值,value的值是一個UploadedFile對象
13 HttpRequest.META 返回一個包含了所有http頭部信息的字典
CONTENT_LENGTH – The length of the request body (as a string). CONTENT_TYPE – The MIME type of the request body. HTTP_ACCEPT – Acceptable content types for the response. HTTP_ACCEPT_ENCODING – Acceptable encodings for the response. HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response. HTTP_HOST – The HTTP Host header sent by the client. HTTP_REFERER – The referring page, if any. HTTP_USER_AGENT – The client’s user-agent string. QUERY_STRING – The query string, as a single (unparsed) string. REMOTE_ADDR – The IP address of the client. REMOTE_HOST – The hostname of the client. REMOTE_USER – The user authenticated by the Web server, if any. REQUEST_METHOD – A string such as "GET" or "POST". SERVER_NAME – The hostname of the server. SERVER_PORT – The port of the server (as a string).
14 HttpRequest.session 中間件屬性
15 HttpRequest.site 中間件屬性
16 HttpRequest.user 中間件屬性,表示當前登錄的用戶。
HttpRequest.user實際上是由一個定義在django.contrib.auth.models 中的 user model 類 所創建的對象。
該類有許多字段,屬性和方法。列舉幾個常用的: 獲取更詳細信息-->官方文檔。
1 字段:
username 用戶名
first_name
last_name
password
groups
user_permissions,
is_staff 布爾值,標明用戶是否可以訪問admin頁面
is_superuser
last_login 上一次登陸時間
date_joined 用戶創建時間
2 屬性
is_authenticated 布爾值,標志着用戶是否已認證。在django1.10之前,沒有該屬性,但有與該屬性同名的方法。
3 方法
1 HttpRequest.user.get_username() 注意:方法的圓括號在templates標簽中必需省略!!
獲取username。盡量使用該方法來代替使用username字段
2 HttpRequest.user.get_full_name() 注意:方法的圓括號在templates標簽中必需省略!!
獲取first_name和last_name
3 HttpRequest.user.short_name() 注意:方法的圓括號在templates標簽中必需省略!!
獲取first_name
4 HttpRequest.user.set_password(raw_password) 注意:該方法無法在template標簽中使用!!
設置密碼
5 HttpRequest.user.check_password(raw_password) 注意:該方法無法在template標簽中使用!!
如果raw_password與用戶密碼相等,則返回True
方法:
1 HttpRequest.get_host() 返回請求的源主機。example: 127.0.0.1:8000
2 HttpRequest.get_port() django1.9的新特性。
3 HttpRequest.get_full_path() 返回完整路徑,並包括附加的查詢信息。example: "/music/bands/the_beatles/?print=true"
4 HttpRequest.bulid_absolute_uri(location) 返回location的絕對uri,location默認為request.get_full_path()。
Example: "https://example.com/music/bands/the_beatles/?print=true"
QueryDict
是一個類似於Python中字典的一種對象,他是Python中字典的子類,所以繼承了字典的所有方法,
當然QueryDict對字典的某些方法進行了加工,並補充了一些獨特的方法。這里列出部分方法。詳情請看: 官方文檔 。
1 QueryDict.get(key,default=None) 返回key所對應的value,若key不存在,則返回default的值
2 QueryDict.update(other_dict) 更新
3 QueryDict.values() 列出所有的值
4 QueryDict.items() 列出所有的鍵值對,若一個key有多個值,只顯示最后一個值。
5 QueryDict.pop(key) 刪除某個鍵值對
6 QueryDict.getlist(key) 根據輸入的key返回一個Python中的list
7 QueryDict.dict() 返回QueryDict的字典的表現形式