天天看點

使用Http協定向伺服器傳參的方式及django擷取參數的方式使用HTTP協定向伺服器傳參的四種方式django擷取參數的方式

文章目錄

  • 使用HTTP協定向伺服器傳參的四種方式
  • django擷取參數的方式
        • URL路徑參數
        • Django中的QueryDict對象
        • 查詢字元串Query String
        • 請求體
        • 請求頭
        • 其他常用HttpResponse對象屬性

使用HTTP協定向伺服器傳參的四種方式

  1. URL路徑攜帶參數,形如/weather/beijing/2018;
  2. 查詢字元串(query string),形如key1=value1&key2=value2;
  3. 請求體(body)中發送的資料,比如表單資料、json、xml;
  4. 在http封包的頭(header)中。

django擷取參數的方式

URL路徑參數

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

1. 未命名參數按定義順序傳遞:
#url層
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather)
#視圖層
def weather(request, city, year):	
	4print('city=%s' % city) 
	print('year=%s' % year)
	return HttpResponse('OK')

2. 命名參數按名字傳遞:
#url層
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather)
#視圖層
def weather(request, year, city):
	print('city=%s' % city)
    	print('year=%s' % year)
    	return HttpResponse('OK')
           

Django中的QueryDict對象

HttpRequest對象的屬性GET、POST都是QueryDict類型的對象

  • 方法get(‘key’)

查詢字元串Query String

擷取請求路徑中的查詢字元串參數(形如?k1=v1&k2=v2),可以通過request.GET屬性擷取,傳回QueryDict對象。

#e.g. 查詢字元串: /qs/?a=1&b=2&a=3
def qs(request):
	#擷取查詢字元串中所有key
	request.GET.keys()	
	
	#擷取查詢字元串中某個key對應的值
	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擷取請求中的查詢字元串資料.

請求體

請求體資料格式不固定,可以是表單類型字元串,可以是JSON字元串,可以是XML字元串,應差別對待。

可以發送請求體資料的請求方式有POST、PUT、PATCH、DELETE。

  1. 表單類型 Form Data

    前端發送的表單類型的請求體資料,可以通過request.POST屬性擷取,傳回QueryDict對象。

def get_body(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')
           

重要: request.POST隻能用來擷取POST方式的請求體表單資料。

  1. 非表單類型 Non-Form Data

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

    request.body傳回bytes類型。

# e.g. 要擷取請求體中的如下JSON資料:{"a": 1, "b": 2}
import json
	def get_body_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.META屬性擷取請求頭headers中的資料,request.META為字典類型。

常見的請求頭如:

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

其他常用HttpResponse對象屬性

  • method:擷取請求方法
  • user:擷取使用者對象
  • FILES[‘表單送出中name的值’]:拿使用者送出的圖檔,檔案等
  • 等等