Django中獲取URL路徑參數(路徑,查詢,請求頭,請求體)


通常HTTP協議向服務器傳參有幾種途徑 :

  提取URL的特定部分,如/weather/shanghai/2018,可以在服務器端的路由中用正則表達式截取;

  查詢字符串(query string),形如key1=value1&key2=value2;

  請求體(body)中發送的數據,比如表單數據、json、xml;

  在http報文的頭(header)中。

  逐一對這幾種方法進行總結:

1.URL中參數的獲取

  在定義路由URL時,可以使用正則表達式提取參數的方法從URL中獲取請求參數,Django會將提取的參數直接傳遞到視圖的傳入參數中。

    1. 1 未命名參數按定義順序傳遞(注意:參數獲取的順序與url中參數的位置一一對應,不能互換)

url(r'^users/([a-z]+)/(\d{4})/$', views.get_user),
  
def get_user(request, name, ID):
    print('name=%s' % name)
    print('id=%s' % id)
    return HttpResponse('OK')

  1.2 命名參數按名字傳遞(注意:如果在路由中指定了參數的名字,name接收參數時,必須要使用路由中指定的參數名稱,不能換成其他名字,此時,兩個參數位置可以互換。)

url(r'^users/(?P<name>[a-z]+)/(?P<id>\d{4})/$', views.users),
  
def weather(request, name, id):
    print('name=%s' % name)
    print('id=%s' % id)
    return HttpResponse('OK')

2.獲取請求路徑中的查詢字符串參數

  (形如?k1=v1&k2=v2),可以通過request.GET屬性獲取,返回QueryDict對象。什么是QueryDict對象?定義在django.http.QueryDictHttpRequest對象的屬性GET、POST都是QueryDict類型的對象,與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況

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

  • 如果一個鍵同時擁有多個值將獲取最后一個值
  • 如果鍵不存在則返回None值,可以設置默認值進行后續處理
dict.get('key',value)==>可簡寫為: dict['key']

   2.2方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值,如果鍵不存在則返回空列表[],可以設置默認值進行后續處理

dict.getlist('',默認值)


  2.3獲取參數實例

    訪問路徑:/user/qs/?a=1&b=2&a=3(注意:查詢字符串不區分請求方式,客戶端GET,POST方式的請求,都可以在后端通過request.GET獲取請求中的查詢字符串數據。)

url(r'^qs/$',views.get_value,name='g_v'),
  
def get_value(request):
    a = request.GET.get('a')  #3
    b = request.GET.get('b')  #2
    num_list = request.GET.getlist('a') #['1','3']
    print(a)
    print(b)
    print(num_list)
  
    return HttpResponse(reverse('user:get_value'))

3.請求體中的參數 

  3.1表單數據獲取
    通過request.POST來獲取(注意:Django默認開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在開發測試時可以關閉CSRF防護機制,方法為在settings.py文件中注釋掉CSRF中間件)

url(r'^getbody/$',views.get_body),
  
def get_body(request):
    form_data = request.POST.get('c')
    print(form_data)
    return HttpResponse(form_data)

  3.2非表單數據獲

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

import json
  
url(r'^getjson/$',views.get_body_json),
  
def get_body_json(request):
    # 得到的是一個二進制數據
    json_str = request.body
    print(json_str)                     # b'{\n    "f":200,\n    "d":300\n    \n}'\
    # 對二進制數據進行解碼,解碼得到json數據
    json_str = json_str.decode()
    print(json_str)                     # {"f":200,"d":300}
    # 將json數據轉化成字典形式
    json_data = json.loads(json_str)
    print(json_data)                    # {'f': 200, 'd': 300}
    # 獲取json數據,使用字典方式取值
    print(json_data['d'])               # 300
    print(json_data['f'])               # 200
    return HttpResponse('ok')

4.例如:Django獲取http請求頭內容

  通過view函數傳遞過來的 reuqest,使用request.META.get("header key")來獲取(注意:header key必須大寫,前綴必須是"HTTP",后面如果連接符是橫線“-”,要改成下划線“_”。例如你的header的key為api_auth,那在Django中應該使用request.META.get("HTTP_API_AUTH")來獲取請求頭的數據。)

5.其他常用HttpRequest對象屬性

  request.method 請求方式

  request.path 請求路徑

  request.user 請求的用戶對象

  request.FILES 一個類似於字典的對象,包含所有的上傳文件

  request.encoding 一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。

url(r'^otherattr/$', views.other_attr),
  
def other_attr(request):
    print(request.method)    # POST
    print(request.path)      # /user/otherattr/
    print(request.encoding)  # None:表示使用瀏覽器的默認設置,一般為utf-8,這個屬性是可寫的,
    # 可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。

 


免責聲明!

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



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