使用HTTP協議向服務器傳參的方式及django中獲取參數的方式


使用HTTP協議向服務器傳參的四種方式

  • URL路徑攜帶參數,形如/weather/beijing/2018;
  • 查詢字符串(query string),形如key1=value1&key2=value2;
  • 請求體(body)中發送的數據,比如表單數據、json、xml;
  • 在http報文的頭(header)中。

django獲取參數的方式

1  URL路徑參數

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

  • 未命名參數按定義順序傳遞, 如

    url(r'^weather/([a-z]+)/(\d{4})/$', views.weather), def weather(request, city, year): print('city=%s' % city) print('year=%s' % year) return HttpResponse('OK') 
  • 命名參數按名字傳遞,如

    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') 

2 Django中的QueryDict對象

定義在django.http.QueryDict

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

與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況

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

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

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

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

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

    dict.getlist('鍵',默認值) 

3. 查詢字符串Query String

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

# /qs/?a=1&b=2&a=3 def qs(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獲取請求中的查詢字符串數據。

4 請求體

請求體數據格式不固定,可以是表單類型字符串,可以是JSON字符串,可以是XML字符串,應區別對待。

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

 

4.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方式的請求體表單數據。

4.2 非表單類型 Non-Form Data

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

例如要獲取請求體中的如下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') 

5 請求頭

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

常見的請求頭如:

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

6 其他常用HttpRequest對象屬性

  • method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
  • user:請求的用戶對象。
  • path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
  • encoding:一個字符串,表示提交的數據的編碼方式。
    • 如果為None則表示使用瀏覽器的默認設置,一般為utf-8。
    • 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
  • FILES:一個類似於字典的對象,包含所有的上傳文件。


免責聲明!

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



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