解決 requests 庫 URL 編碼問題

金木大大大發表於2023-11-20

在使用 requests 庫進行 URL 請求時,經常會遇到需要對 URL 進行編碼的情況。然而,在某些情況下,需要傳送未編碼的 URL,例如用於測試防火牆配置。但根據實際測試結果,即使按照 requests 庫官方文件中的解決方法,傳送的 URL 仍然會被編碼。這個問題由使用者 LudiusMaximus 在 bug #6115 中提出。


## 解決方案


為了解決這個問題,我們需要找到一種方法來防止 requests 庫對 URL 進行編碼。一種可能的解決方案是使用 requests 庫提供的 `prepare` 方法來建立一個預處理的請求,然後使用此請求來傳送請求。


以下是一個示例程式碼:


```python

import requests


# 建立一個會話物件

s = requests.Session()


# 配置代理和關閉 SSL 驗證(僅用於示例,生產環境中需要謹慎使用)

s.proxies = {

    "http": "

    "https": "

}

s.verify = False


# 定義基本 URL 和查詢引數

base_url = '

query = '?date_range=2017-01-01|2017-03-01'


# 建立一個請求物件

req = requests.Request('GET', base_url)


# 使用 prepare 方法建立預處理請求

p = req.prepare()


# 將查詢引數新增到預處理請求的 URL 中

p.url += query


# 使用預處理請求傳送請求

req = p

resp = s.send(req)


# 列印最終的請求 URL

print(resp.request.url)

```


在這段程式碼中,首先建立了一個 requests.Session 物件,配置了代理並關閉了 SSL 驗證(僅用於示例,實際生產環境中需要小心使用)。然後,定義了基本的 URL 和查詢引數,並建立了一個請求物件。接著,使用 `prepare` 方法建立了一個預處理請求,並將查詢引數新增到預處理請求的 URL 中。最後,使用預處理請求來傳送實際請求。這樣,requests 庫就不會對 URL 進行編碼,解決了該問題。


透過這種方式,你可以在需要傳送未編碼的 URL 的情況下,使用 requests 庫來進行請求,確保 URL 不被自動編碼。但請注意,在生產環境中,關閉 SSL 驗證和使用代理需要謹慎處理,以確保安全性和可靠性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70032566/viewspace-2996159/,如需轉載,請註明出處,否則將追究法律責任。

相關文章