咱們在使用python作接口測試的時候,一般使用的是requests庫。而你們都知道還有一個request東西,不少人對requests與request兩個東西傻傻分不清。下面我簡單來介紹一下。前端
本文所講python3,由於python2於2020年已經停更。那requests和request有什麼區別呢?python
1.requests是python3的一個http請求庫,request是urllib庫的一個方法,因此一個是庫,一個是方法。
數據庫
urllib具體使用:django
2.python3網絡請求主要使用urllib,requests,urllib3,其實requests底層就是urllib3,因此urllib3沒有單獨使用,直接使用requests更加簡潔,但功能沒urllib強大。還有一點就是python3.3後urllib2已經不能再用,只能用urllib.request來代替。json
因此python3主要使用urllib和requests去請求接口。後端
上面我簡單介紹了requests庫與request方法的區別,而在django中,是如何獲取請求參數呢?cookie
請記住一點:requests是用來發送請求的,在django中request是用來獲取請求參數的。網絡
使用形式:session
發送請求: requests.post()函數
django獲取請求參數:request.POST.get()
那麼問題來了,django視圖函數中的request到底哪裏來的?
views每一個方法的參數都是request,那麼問題來了,request爲什麼物?
首先,幾乎每一個方法都是取數據(不管是從數據庫,仍是從第三方接口),而後進行必定的處理,以後傳給前端。而前端請求數據,就會向後端發送一個http請求,這個請求的請求路徑,通過urls,會調用url中指定的方法。此時django就會將HttpRequest對象做爲第一個參數傳入此方法。故,request即爲一個httpRequest對象。
而後,出現了一個新問題,httpRequest是什麼,又含有什麼屬性和方法?
httpRequest類定義在django.http中
httpRequest對象是由django自動建立的
常見屬性:
HttpRequest.method 字符串類型,表示所用的http方法
HttpRequest.content_type 指content_type頭解析的請求的MIME類型
HttpRequest.content_params 指content_type標題中的 k/v參數字典
HttpRequest.GET 此爲一個字典同樣的對象,裏面有get請求中的全部參數
HttpRequest.POST 此亦爲一個字典同樣的對象,裏面有post請求表單中數據
HttpRequest.COOKIES 此仍爲一個字典同樣的對象,包含全部的cookie數據
HttpRequest.session : SessionMiddleware中間件,可讀寫的,爲一個字典同樣的對象,表示當前會話。咱們要保存用戶狀態,回話過程等等,須要利用此中間件
HttpRequest.user : AuthenticationsMiddleware中間件:表示當前登陸用戶的AUTH_USER_MODEL實例,若未登陸,賊user爲AnonymousUser實例
QueryDict:
在HttpRequest 對象中,屬性 GET 和 POST 獲得的都是 django.http.QueryDict 所建立的實例,此亦爲一個相似於字典同樣的類。
常常用的方法爲QueryDict.get(key,default) ,返回key對應的值,若對應多個值,則返回最後的值,若key不存在,則返回默認值。
當請求一個頁面時,Django 把請求的 metadata 數據包裝成一個 HttpRequest 對象,而後 Django 加載合適的 view 方法,把這個 HttpRequest 對象做爲第一個參數傳給 view 方法。任何 view 方法都應該返回一個 HttpResponse 對象。
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,天天學一點,邁向成功路。