1. 程式人生 > >django-request獲取資料

django-request獲取資料

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)
View Code

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 

      email

      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的字典的表現形式