引言
我們在使用python做接口測試的時候,通常使用的是requests庫。而大家都知道還有一個request東西,很多人對requests與request兩個東西傻傻分不清。下面我簡單來介紹一下。
Requests與Request
本文所講python3,因為python2於2020年已經停更。那requests和request有什么區別呢?
1.requests是python3的一個http請求庫,request是urllib庫的一個方法,所以一個是庫,一個是方法。
urllib具體使用:
- urllib.request 用於打開和讀取URL,
- urllib.error 用於處理前面request引起的異常,
- urllib.parse 用於解析URL,
- urllib.robotparser用於解析robots.txt文件
2.python3網絡請求主要使用urllib,requests,urllib3,其實requests底層就是urllib3,所以urllib3沒有單獨使用,直接使用requests更加簡潔,但功能沒urllib強大。還有一點就是python3.3后urllib2已經不能再用,只能用urllib.request來代替。
所以python3主要使用urllib和requests去請求接口。
Django 獲取請求參數原理
上面我簡單介紹了requests庫與request方法的區別,而在django中,是如何獲取請求參數呢?
請記住一點:requests是用來發送請求的,在django中request是用來獲取請求參數的。
使用形式:
發送請求: requests.post()
django獲取請求參數:request.POST.get()
那么問題來了,django視圖函數中的request到底哪里來的?
views每個方法的參數都是request,那么問題來了,request為何物?
HttpRequest對象
當請求一個頁面時,Django 把請求的 metadata 數據包裝成一個 HttpRequest 對象,然后 Django 加載合適的 view 方法,把這個 HttpRequest 對象作為第一個參數傳給 view 方法。任何 view 方法都應該返回一個 HttpResponse 對象。
HttpRequest中方法使用
HttpRequest 對象表示來自某客戶端的一個單獨的 HTTP 請求。HttpRequest 對象是 Django 自動創建的。
它的屬性有很多,可以參考 DjangoBook,比較常用的有以下幾個:
1. method 請求方法,如:
這里不介紹了,具體可以參考官方文檔:https://docs.djangoproject.com/zh-hans/2.2/ref/request-response/#django.http.HttpRequest
2.獲取url中的請求參數
需求:假設用戶訪問127.0.0.1/user/1/2,你想獲取1,2。應該怎么操作呢?
(1)未命名參數(位置參數)
# 在項目下的urls.py下增加設置: url(r'^user/(\d+)/(\d+)$',views.index) # 在user.views的index視圖中: def index(request,a,b): # 接受的參數按順序的 return HttpResponse("獲得數據 %s %s"%(a,b))
(2)命名參數(關鍵字參數)
# 在項目下的urls.py下增加設置: url(r'^user/(?P<category>\d+)/(?P<id>\d+)$',views.index) # 在user.views的index視圖中: def index(request,id,category): # 接受的參數可以不用按順序的 return HttpResponse("獲得數據 %s %s"%(category,id))
輸出結果均是 獲得數據 1 2
另一種形式:
結果:
3.獲取查詢字符串
需求:獲取127.0.0.1:8000/user?id=1&pid=99的查詢字符串的值
# 在項目下的urls.py下增加設置: url(r'^user/$',views.index) # 在user.views的index視圖中: def index(request): id = request.GET.get("id") pid = request.GET.get("pid") return HttpResponse("獲得數據 %s %s"%(id,pid))
注意:查詢字符串的獲取與請求方式無關:不管是 GET
還是 POST
請求,都可以通過request.GET
屬性來獲取!!!
4.獲取表單數據
注意:request.POST
只能用來獲取POST方式的請求體表單數據!
使用postman請求
控制台日志:
5.獲取非表單類型
request.body
屬性:獲取非表單類型的請求體數據,如:JSON、XML等,獲取到的數據類型為bytes
類型- 獲取數據后,自己解析數據取出參數
def index(request): json_str = request.body json_str = json_str.decode() # python3.6及以上不用這一句代碼 dict_data = json.loads(json_str) # loads把str轉換為dict,dumps把dict轉換為str id = dict_data.get("id") pid = dict_data.get("pid") return HttpResponse("獲得數據 %s %s"%(id,pid))
再看一個接口:
接口路徑:/v1/add_user,使用postman模擬一下
看看官方怎么說的:
截圖中大致意思是如果請求數據是原始數據或非表單數據,可以使用httprequest.body來訪問,也就是request.body方法。方法就介紹到這里,這些都是最常用的。
附錄
獲取請求頭的內容:
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).
獲取請求頭內容的用META
示例:
def index(request): ip = request.META.get("REMOTE_ADDR") return HttpResponse("你的ip地址是%s"%ip)
獲取自定義請求頭的內容
用postman增加一個自定義的請求頭,key=id,value=1。那么應該怎么取呢?
代碼如下:
def index(request): id = request.META.get("HTTP_ID") return HttpResponse("你的id:%s"%id)
注意:獲取自定義的請求頭屬性值時,需要添加前綴 HTTP_
並轉成大寫,作為鍵來獲取值
歡迎加入測試開發QQ學習群:696400122,每天學一點,邁向成功路。