Django項目請求參數傳遞方法和請求頭信息的獲取


1. URL路徑參數

  • 如果想從URL中獲取值,需要在正則表達式中使用分組
  • 獲取值分為兩種方式
    • 位置參數
      • 參數的位置不能錯
    • 關鍵字參數
      • 參數的位置可以變,跟關鍵字保持一致即可
  • 注意:兩種參數的方式不要混合使用,在一個正則表達式中只能使用一種參數方式

位置參數

  • 應用中urls.py

    url(r'^(\d+)/(\d+)/$', views.index)

    說明:上面的路徑正則進行了分組,分組后,Django會按順序將這些值作為視圖方法的位置參數傳遞

  • 視圖中函數: 參數的位置不能錯

    def index(request, value1, value2):
          # 構造上下文
          context = {'v1':value1, 'v2':value2}
          return render(request, 'Book/index.html', context)

    說明:視圖第一個參數為默認參數,路由中的路徑參數從第二個開始按為位置參數傳遞到這里的value1和value2

關鍵字參數

  • 應用中urls.py

    • 其中?P<value1>部分表示為這個參數定義名稱為value1  
    • 可以是其它名稱,起名要做到見名知意

      url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),

      說明:使用的是正則表達式中為分組命名的方式實現關鍵字參數傳遞,value1、value2會按關鍵字參數的方式傳遞給視圖

  • 視圖中函數: 參數的位置可以變,跟關鍵字保持一致即可

    def index(request, value2, value1):
          # 構造上下文
          context = {'v1':value1, 'v2':value2}
          return render(request, 'Book/index.html', context)

    說明:推薦使用關鍵字參數,避免出錯

2. URL路徑上的請求參數(?后面拼接的參數)

如獲取到這個路徑后拼接的參數:

# /get/?a=1&b=2&a=3

獲取參數方法:使用視圖方法第一個參數request的GET屬性獲取

querydict = request.GET

request.GET獲取到的是一個QueryDict對象,QueryDict對象中有兩個方法,分別獲取參數名相同的單一參數值(上面參數中的b)和多個參數值(上面參數中的a)

  • 方法get():根據鍵獲取值

    如果一個鍵同時擁有多個值將獲取最后一個值

    如果鍵不存在則返回None值,可以設置默認值進行后續處理

    get('鍵',默認值)
    
  • 方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值

    如果鍵不存在則返回空列表[],可以設置默認值進行后續處理

    getlist('鍵',默認值)
  • 示例:
def get(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    alist = request.GET.getlist('a')
    print(a)  # 3
    print(b)  # 2
    print(alist)  # ['1', '3']
    return HttpResponse('OK')

注意:查詢字符串不區分請求方式,即假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢參數。

 3. 請求體參數獲取

  • 請求體數據格式不固定,可以是表單類型字符串,可以是JSON字符串,可以是XML字符串,應區別對待。
  • 可以發送請求體數據的請求方式有POST、PUT、PATCH、DELETE。
  • Django默認開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py文件中注釋掉CSRF中間件:

    

 

 

 

3.1 表單類型 Form Data

前端發送的表單類型的請求體數據,可以通過request.POST屬性獲取,返回QueryDict對象。

def post(request):
    a = request.POST.get('a')
    b = request.POST.get('b')
    alist = request.POST.getlist('a')
    print(a)
    print(b)
    print(alist)
    return HttpResponse('OK')

3.2 非表單類型 Non-Form Data

非表單類型的請求體數據,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體數據,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes類型。

例如要獲取請求體中的如下JSON數據

{"a": 1, "b": 2}

可以進行如下方法操作:

import json

def post_json(request):
    json_str = request.body
    json_str = json_str.decode()  # python3.6 無需執行此步
    req_data = json.loads(json_str)
    print(req_data['a'])
    print(req_data['b'])
    return HttpResponse('OK')

注意:

  request.body獲取的是一個字符串

4.獲取請求頭信息

可以通過request.META屬性獲取請求頭headers中的數據,request.META為字典類型。

自定義頭信息時,系統自動在請求頭名稱前面拼接上了'HTTP_', 因此獲取的時候需要在前面加上'HTTP_', 如:我們傳遞自定義頭信息{"myhead": "abc"},獲取的時候:

print(request.META["HTTP_MYHEAD"])        # 頭信息名稱都為大寫

 

常見的請求頭如:

  • 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).

具體使用如:

def get_headers(request):
    print(request.META['CONTENT_TYPE'])
    return HttpResponse('OK')

注意:

頭信息中的key都為大寫,系統自動轉為大寫

5. 其他常用HttpRequest對象屬性

  • method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
  • user:請求的用戶對象。
  • path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
  • encoding:一個字符串,表示提交的數據的編碼方式。

    • 如果為None則表示使用瀏覽器的默認設置,一般為utf-8。
    • 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
  • FILES:一個類似於字典的對象,包含所有的上傳文件。

 


免責聲明!

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



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