背景:
使用requests时,想自己写一个缓存函数,需要在请求执行前获取完整url。requests传url有两种,一种是完整路径写在url中,另一种是base_url和params分开传,在请求时由requests自行组装。
思路:
通常利用requests获取资源时,想要获得完整url,通常可以在请求响应后,通过实例.url获取。比如:
page = requests.get(base_url, kval_pairs)
print(page.url)
这样的问题是,服务器做了一次请求。但实际上,我的需求并不需要这次请求。所以看了一下源代码,发现requests在获得请求之前,会对url进行一次组装。源代码在models.py文件中的PreparedRequest类下。所以利用如下代码,可以直接获得url。
from requests.models import PreparedRequest
def requestURL(baseurl, params):
p = PreparedRequest()
return p.prepare_url(baseurl, params)
测试一下:
# test1
base_url_1 = "https://api.datamuse.com/words?ml=ringing+in+the+ears&sp=b%2A"
kval_pairs_1 = ""
page = requests.get(base_url_1, kval_pairs_1)
print(f"test1: {page.url}")
# test2
base_url_2 = "https://api.datamuse.com/words"
kval_pairs_2 = {"ml":"ringing in the ears", "sp":"b*"}
page = requests.get(base_url_2, kval_pairs_2)
print(f"test2: {page.url}")
输出结果:
test1: https://api.datamuse.com/words?ml=ringing+in+the+ears&sp=b%2A
test2: https://api.datamuse.com/words?ml=ringing+in+the+ears&sp=b%2A
可以把这段代码封装成自己的函数,用来做URL的合成函数,优点就是成熟,可以避免自己写组装url函数带来的一些坑。