Django基礎之request對象


當一個頁面被請求時,django就會創建一個包含本次請求原信息的HttpRequest對象。

django會將這個對象自動傳遞給響應的視圖函數,一般視圖函數約定俗成地使用request參數承接這個對象。

1. 請求相關的常用值

  • path_info: 返回用戶訪問url, 不包括域名
  • method: 請求中使用的HTTP方法的字符串表示,全大寫表示。
  • GET: 包含所有HTTP GET參數的類字典對象
  • POST: 包含所有HTTP POST參數的類字典對象
  • body: 請求體,byte類型,request POST的數據就是從body里面提取到的
  • 2. 屬性

    django將請求報文中的請求行、頭部信息、內容主體封裝成HttpRequest類中的屬性。除了特殊說明的之外,其他均為只讀的。
    (1) HttpRequest.scheme
    表示請求方案的字符串(通常為http或https)
    (2) HttpRequest.body
    一個字符串,代表請求報文的主題。在處理非HTTP形式的報文時非常有用。例如,二進制圖片,XML, Json等。
    但是,如果要處理表單數據的時候,推薦還是使用HttpRequest.POST。
    另外,我們還可以用python的類文件方法去操作它,詳情參考HttpRequest.read()。
    (3) HttpRequest.path
    一個字符串,表示請求的路徑組件(不含域名)。
    比如:"/music/bands/the_beatles/"
    (4) HttpRequest.method
    一個字符串,表示請求使用的HTTP方法,必須使用大寫。例如:“GET”、“POST”
    (5) HttpResponse.encoding
    一個字符串,表示提交的數據的編碼方式(如果為None則表示使用DEFAULT_CHARSET的設置,默認為"UTF-8")。
    這個屬性是可寫的,你可以修改它來修改訪問表單數據使用的編碼。
    接下來對屬性的任何訪問(例如從GET或POST中讀取數據),將使用新的encoding值。
    如果你知道表單數據的編碼不是DEFAULT_CHARSET,則使用它。
    (6) HttpRequest.GET
    一個類似於字典的對象,包含HTTP GET的所有參數。詳情參考QueryDict對象。
    (7) HttpRequest.POST
    一個類似於字典的對象,如果請求中包含表單數據,則將這些數據封裝成QueryDict對象。
    POST請求額可以帶有空的POST字典——如果通過HTTP POST方法發送一個表單,但是表單沒有任何的數據,QueryDict對象依然會被創建。
    因此,不應該使用 if request.POST來檢查使用的是否是POST方法,應該使用 if request.method == "POST"
    另外,如果使用POST上傳文件的話,文件信息將包含在FILES屬性中。
    (8) HttpRequest.COOKIES
    一個標准的Python字典,包含所有的cookie。鍵和值都為字符串。
    (9) HttpRequest.FILSES
    一個類似於字典的對象,包含所有的上傳文件信息。
    FILES中的每個鍵為<\input type="file" name="">中的name, 值則為對應的數據。
    注意,FILES只有在請求的方法為POST, 且提交的 <\from>帶有 enctype="multipart/form-data"的情況下才會包含數據,否則,FILES將為一個空的類似於字典的對象。
    (10) HttpRequest.META
    一個標准的字典,包含所有的HTTP首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例:
    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 服務器認證后的用戶
    REMOTE_METHOD 一個字符串,例如“GET”或“POST”
    SERVER_NAME 服務器的主機名
    SERVER_PORT 服務器的端口(是一個字符串)

    從上面可以看到,出CONTENT_LENGTH和CONTENT_TYPE之外,請求中的任何HTTP首部轉換為META的鍵時,都會將所有字母大寫並將連接符替換為下划線,最后加上HTTP_前綴。

    所以一個叫做X-Bender的頭部將轉換成META中的HTTP_X_BENDER鍵。

    (11) HttpRequest.user
    一個AUTH_USER_MODEL類型的對象,表示當前登錄的用戶。
    如果用戶當前沒有登錄,user將設置為django.contrib.auth.models.AnonymousUser 的一個實例。
    你可以通過is_authenticated()區分它們。
    例如: ```Python 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接口,但具有下面幾個不同點:
    is 永遠為 None。
    username() 永遠 返回空字符串。
    is_staff 和 is_superuser 永遠為False。
    is_active 永遠為 False。
    gropus和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.modele.User.
    (12) HttpRequest.session
    一個即可讀又可寫的類似於字典的對象,表示當前的會話.只有當django啟用會話的支持時才可用.

    3. 上傳文件示例

    ```Python def upload(request): """ 保存文件上傳前,數據需要保存在某個位置。 默認當上傳文件小於2.5M時,django會將上傳文件的全部內容讀進內存。 從內存讀取一次,寫磁盤一次 當上傳文件很大時,django會把上傳文件寫到臨時文件中,然后存放到系統臨時臨時文件夾中。 :param request: :return: """ if request.method == "POST": # 從請求的FILES中獲取上傳文件的文件名 # file為頁面上type=files類型input的name屬性值 filename = request.FILES["file"].name # 在項目目錄下新建一個文件 with open(filename, "wb") as f: #從上傳的文件對象中一點一點讀 for chunk in request.FILES["file"].chunks(): f.write(chunk) return HttpResponse("upload successfully!") ```

    4. 方法

    4.1 HttpRequest.get_host()

    根據從HTTP_X_FORWARDED_HOST(如果打開USE_X_FORWARDE_HOST,默認為false)和HTTP_HOST頭部信息返回請求的原始主機。
    如果這兩個頭部沒有提供相應的值,則使用SERVER_NAME和SERVER_PORT,在PEP3333中有詳細描述。
    USE_X_FORWARDED_HOST:一個布爾值,用於是否優先使用X-Fforwarded-Host首部,僅在代理設置了該首部的情況下,才可以被使用。例如:"127.0.0.1:8000"
    注意:當主機位於多個代理后面時,get_host()方法將會失敗。除非使用中間件重寫代理的首部。

    4.2 HttpRequest.get_full_path()

    返回path,如果可以將加上查詢字符串。
    例如:"/music/bands/the_beatles/?print=true"

    4.3 HttpRequest.get_signed_cookid()

    語法格式為: >HttpRequest.get_signed_cookid(key, default=RAISE_ERROR, salt="", max_age=None)

    返回簽名過的Cookie對應的值,如果簽名不再合法則返回django.core.signing.BadSignature。

    如果提供default參數,將不會引發異常並返回default的值。

    可選參數salt,可以用來對安全密鑰強力攻擊提供額外的保護。

    max_age參數用於檢查Cookie對應的時間戳以確保Cookie的時間不會超過max_age秒。

    4.4 HttpRequest.is_secure()

    如果請求時安全的,則返回True,即請求是通過HTTPS發起的。

    4.5 HttpRequest.is_ajax()

    如果請求是通過XMLHttpRequest發起的,則返回True,方法是檢查HTTP_X_REQUESTED_WITH相應的首部是否是字符串"XMLHttpRequest"。
    大部分現代的javaScript庫都會發送這個頭部。如果編寫自己的XMLHttpRequest調用(在瀏覽器端),你必須手工設置這個值來讓is_ajax()可以工作。
    如果一個響應需要根據請求是否是通過AJAX發起的,並且你正在使用某種形式的緩存如django的cache middleware,你應該使用vary_on_headers("HTTP_X_REQUESTED_WITH")裝飾你的視圖以讓響應能夠正確地緩存。

    4.6 注意

    鍵值對的值是多個的時候,比如checkbox類型的input標簽,select標簽,需要用: ```Python request.POST.getlist("hobby") ```


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM