1. 程式人生 > >Python Requests 小技巧總結

Python Requests 小技巧總結

red access int cat req pretty time 狀態 cts

關於 Python Requests ,在使用中,總結了一些小技巧把,分享下。


1:保持請求之間的Cookies,我們可以這樣做。

import requests
self.session = requests.Session()
self.session.get(login_url) # 可以保持登錄態

2:請求時,會加上headers,一般我們會寫成這樣

self.session.get(url, params, headers=headers)

唯一不便的是之後的代碼每次都需要這麽寫,代碼顯得臃腫,所以我們可以這樣:

#在構造函數中,這樣設置是全局的。

# 設置請求頭
self.s = requests.Session()
self.s.headers = {‘balabala‘}

# 移除服務器驗證
self.s.verify = False

# 設置代理
self.s.proxies={‘aa‘}

# 如果後續headers有改變,再次賦值就可以了。
self.s.get(url, params, headers=new_headers)

3:默認requests請求失敗後不會重試,但是我們跑case時難免遇到一些網絡,服務重啟,外部原因導致case失敗,我們可以在Session實例上附加HTTPAdapaters 參數,增加失敗重試次數。

request_retry = requests.adapatrs.HTTPAdapaters(max_retries=3)

self.session.mount(‘https://‘,request_retry)  
self.session.mount(‘http://‘,request_retry)

這樣,之後的請求,若失敗,重試3次。


4:重定向
網絡請求中可能會遇到重定向,我們需要一次處理一個請求,可以把重定向禁止。

self.session.post(url,data,allow_redirects=False)

5: post請求提交json格式數據時(請求頭為:{“Content-Type”: “application/json”}),一般先要把python對象轉換成json對象。可能很多時候是這樣寫:

self.session.post(url, data=json.dumps(data))。

其實post有一個默認參數json,可以直接簡寫成:

 self.session.post(url, json=data)

6:寫接口請求,debug時,會需要看下代碼請求的詳細信息,當然我們可以使用fiddler來查看,其實我們自己也可以在代碼這樣獲取debug信息*

import requests
import logging
import httplib as http_client

http_client.HTTPConnection.debuglevel = 1

logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

requests.get(‘https://www.baidu.com‘)

#更好的方法是自己封裝一個裝飾器,就可以為任意請求函數添加一個debug功能。

7:使用grequests實現異步請求。

pip install grequests

import grequests

urls = [
    ‘http://www.url1.com‘,
    ‘http://www.url2.com‘,
    ‘http://www.url3.com‘,
    ‘http://www.url4.com‘,
    ‘http://www.url5.com‘,
    ‘http://www.url6.com‘,
]

resp = (grequests.get(u) for u in urls)
grequests.map(resp)

# [<Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>]

8:發送自定義cookies
我們使用Session實例來保持請求之間的cookies,但是有些特殊情況,需要使用自定義的cookies
我們可以這樣

# 自定義cookies
cookie = {‘guid‘:‘5BF0FAB4-A7CF-463E-8C17-C1576fc7a9a8‘,‘uuid‘:‘3ff5f4091f35a467‘}

session.post(‘http://wikipedia.org‘, cookies=cookie) 

9:需求確定前後端並行設計時,這時測試並沒有辦法調用接口,如何做接口測試呢?我們可以使用mock或者是httpretty

import requests
import httpretty

# 模擬返還的狀態碼
@httpretty.activate
def test_beta1_access():
    httpretty.register_uri(httpretty.GET, "http://beta.com/",
                           body="here is the mocked body",
                           status=201)

    response = requests.get(‘http://beta.com‘)
    expect(response.status_code).to.equal(201)

# 模擬返還response的body
@httpretty.activate
def test_some_api():
    httpretty.register_uri(httpretty.GET, "http://beta.com/",
                           body=‘{"success": false}‘,
                           content_type=‘text/json‘)

    response = requests.get(‘http://beta.com/‘)

    expect(response.json()).to.equal({‘success‘: False})

詳細使用可以查看API_DOC


10:統計一個API請求花費的時間,我們可以使用如下方法

self.session.get(url).elapsed 

11:設置請求超時


self.session.get(url, timeout=15)

# timeout 僅對連接過程有效,與響應體的下載無關。 
# timeout 並不是整個下載響應的時間限制,而是如果服務器在15 秒內沒有應答,將會引發一個異常(更精確地說,是在 timeout 秒內沒有從基礎套接字上接收到任何字節的數據時)

關於Python ,requests的小技巧,就是這些。

Python Requests 小技巧總結