它用于表示一个经过预处理但尚未发送的请求。
PreparedRequest类有10个方法:
1个主方法:设置HTTP请求的所有参数prepare()
7个子方法:设置HTTP请求的单个参数prepare_method()、url、headers、body、auth、cookies、hooks
2个钩子方法:注册钩子函数register_hook(event,hook)、注销钩子register_hook(event,hook)
还有6个参数:method、url、headers、body、path_url、hooks
用来获取PreparedRequest对象的单个参数值。
使用PreparedRequest类的方法和属性时,需要先创建一个PreparedRequest实例,如:req=requests.PreparedRequest(),然后req实例调用PreparedRequest类的方法和属性。
用Request对象也有相似的方法来表示一个预处理但未发送的请求对象,如req = request.Request(method=method,url=url...),req = req.prepare()。
PreparedRequest 类允许您在发送请求之前进行各种配置和修改,包括设置请求头、URL 参数、请求体等。
一旦您通过 requests.PreparedRequest() 创建了一个请求对象,您可以再使用 prepare() 方法设置各项请求参数,然后可以进一步修改或检查该请求,最后通过 Session 或 send() 方法发送。
在一般的使用中,大多数人直接使用 requests.get()、requests.post() 等方法,而不必手动创建 Request 或 PreparedRequest 对象。这是因为这些方法已经封装了构建请求、准备请求和发送请求的步骤,使得使用起来更加方便。
用法:
>>> import requests
>>> req = requests.Request('GET', 'http://httpbin.org/get')
>>> r = req.prepare()
>>> s = requests.Session()
>>> s.send(r)
例:
import requests
# 创建一个请求对象
url = 'https://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'} # 载荷数据
headers = {'content-type': 'application/json'}
# 使用requests.Request()方法构造一个HTTP请求对象,但不发送它。
request = requests.Request('POST', url, data=payload, headers=headers)
# 使用prepare()方法将请求对象转换为PreparedRequest对象
prepared_request = request.prepare()
# 进一步修改请求对象(可选)
prepared_request.headers['new_header'] = 'new_value'
# 使用Session发送请求
with requests.Session() as session:
response = session.send(prepared_request)
print(response.text)
方法
先构造一个PreparedRequest实例,然后用实例调用prepare()方法设置请求参数。
这个方法会根据提供的参数创建一个 PreparedRequest 对象,该对象表示一个完整的 HTTP 请求,可以用于发送 HTTP 请求。
例:
import requests
url = 'https://yiyan.baidu.com/'
headers = {'User-Agent':'My User Agent 1.0'}
params = {'key1':'value1'}
# 先创建一个PreparedRequest实例
prepared_request = requests.PreparedRequest()
# 再调用PreparedRequest的prepare()方法构造请求
prepared_request.prepare(method='GET',url=url,headers=headers,params=params)
print(prepared_request) # 输出:
这个方法用于设置HTTP请求的方法,如GET、POST、PUT、DELETE等。
例:
import requests
url = 'https://example.com'
method = 'POST'
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare(method, url)
# 使用prepare_method方法设置请求方法
req.prepare_method(method)
print(req.method) # 输出:POST
# 发送请求
# response = requests.Session().send(req)
这个方法用于设置HTTP请求的URL
例:
import requests
url = 'https://example.com'
method = 'POST'
params = {'key1':'value1'}
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare(url='https://www.baidu.com',method=method)
# 使用prepare_method方法设置请求方法
req.prepare_url(url,params)
print(req.url) # 输出:https://example.com/?key1=value1
# 发送请求
# response = requests.Session().send(prepared_req)
用于设置HTTP请求的headers。
例:
import requests
headers = {'User-Agent':'My User Agent 1.0'}
url = "https://www.baidu.com"
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare(method='GET', url=url)
# 使用prepare_cookies方法设置cookie信息
req.prepare_headers(headers)
print(req.headers) # 输出:{'User-Agent': 'My User Agent 1.0'}
由于这是一个内部方法,它并没有被广泛文档化,并且可能在将来的库版本中发生变化。在正常的请求流程中,你通常不需要直接调用这个方法。
参数说明:
data: 一个字典,包含要发送的表单数据。这些数据将被序列化为字节流。
files: 一个字典,用于上传文件。字典的键是文件字段的名称,值是一个包含文件名、文件内容(字节流)和文件类型的三元组。
json: 一个Python对象,将被自动转换为JSON格式并作为请求体发送。如果提供,这个参数将覆盖data和files。
例:
import requests
from pprint import pprint
data = {'key1':'value1'}
files = {'file': ('example.txt', b'This is the file content', 'text/plain')}
url = "https://www.baidu.com"
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare('GET', url)
# 使用prepare_body方法设置body信息
req.prepare_body(data=data,files=files)
pprint(req.body)
# 输出:
(b'--e82c892848a3acdbd390f9b3a9f48086\r\nContent-Disposition: form-data; name'
b'="key1"\r\n\r\nvalue1\r\n--e82c892848a3acdbd390f9b3a9f48086\r\nContent-Dispo'
b'sition: form-data; name="file"; filename="example.txt"\r\nContent-Type: te'
b'xt/plain\r\n\r\nThis is the file content\r\n--e82c892848a3acdbd390f9b3a9f4'
b'8086--\r\n')
# 发送请求
# response = requests.Session().send(req)
用于准备请求的认证信息。这个方法通常用于设置HTTP请求的认证头,例如基本认证(Basic Authentication)或摘要认证(Digest Authentication)。
参数说明:
auth: 认证信息,可以是元组、字符串或AuthBase子类的实例。如果是元组,它应该包含两个字符串元素:用户名和密码。如果是AuthBase子类的实例,它应该已经包含了认证信息。
url: 认证信息的URL,默认为空字符串。这个参数通常只在需要为特定URL设置认证头时使用。
这个方法主要用于当你需要为特定URL设置认证头时,而不仅仅是在创建PreparedRequest对象时设置。如果你在创建PreparedRequest对象时已经设置了认证信息,那么可以使用这个方法来更新或覆盖现有的认证信息。
例:
import requests
from requests.auth import HTTPBasicAuth
url = 'https://api.example.com/protected'
username = 'myusername'
password = 'mypassword'
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare('GET', url)
# 使用prepare_auth方法设置认证信息
req.prepare_auth(HTTPBasicAuth(username, password), url)
# 发送请求
# response = requests.Session().send(req)
这个方法用于设置HTTP请求的cookie。
cookies: 一个字典,包含要发送的cookie信息。
例:
import requests
url = 'https://example.com'
cookies = {'cookie_name': 'cookie_value'}
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare('GET', url)
# 使用prepare_cookies方法设置cookie信息
req.prepare_cookies(cookies)
# 发送请求
# response = requests.Session().send(prepared_req)
在Python的requests库中,PreparedRequest.prepare_hooks(hooks)方法用于准备请求的钩子(hooks)。钩子是一种机制,允许你在请求的不同阶段插入自定义逻辑。
参数说明:
hooks: 一个字典,包含请求钩子的设置。每个键是一个请求阶段名称(如'response'),对应的值是一个函数或可调用对象。
这个方法主要用于当你需要在请求的不同阶段执行自定义逻辑时。
注册一个钩子函数。
例:
import requests
def my_hook(response, *args, **kwargs):
print('Response status code:', response.status_code)
url = 'https://yiyan.baidu.com/'
headers = {'User-Agent':'My User Agent 1.0'}
params = {'key1':'value1'}
# 先创建一个PreparedRequest实例
prepared_request = requests.PreparedRequest()
# 再调用PreparedRequest的prepare()方法构造请求
prepared_request.prepare(method='GET',url=url,headers=headers,params=params)
# 注册一个响应钩子
# print(type(prepared_request))
prepared_request.register_hook('response', my_hook)
# 发送请求
response = requests.Session().send(prepared_request)
输出:Response status code: 200
这个方法用于从请求中注销之前注册的事件钩子。钩子存在返回True,否则返回False。
event:这是一个字符串,表示要注销钩子的特定事件。例如,你可以使用 'response' 来注销所有与响应相关的钩子。
hook:这是你要注销的钩子的函数或可调用对象。
例:
import requests
def my_hook(response, *args, **kwargs):
print("Hook called for response:", response.status_code)
# 创建一个PreparedRequest对象
req = requests.PreparedRequest()
req.prepare('GET', 'https://httpbin.org/get')
# 注册一个钩子函数
req.register_hook('response', my_hook)
# 发送请求,此时会调用my_hook函数
with requests.Session() as s:
s.send(req) # 输出:Hook called for response: 200
# 取消刚刚注册的钩子函数
req.deregister_hook('response', my_hook)
# 再次发送请求,此时不会调用my_hook函数了
with requests.Session() as s:
s.send(req)
method 属性表示 HTTP 请求的方法(或动作)。HTTP 请求方法定义了对指定资源的操作类型。常见的 HTTP 方法包括 GET、POST、PUT、DELETE 等。
这个属性对于检查或修改请求的方法很有用,尤其是在使用 PreparedRequest 对象之前。
例:
import requests
url = 'https://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
# 创建一个 POST 请求对象
request = requests.Request('POST', url, data=payload)
# 使用 prepare() 方法将请求对象转换为 PreparedRequest 对象
prepared_request = request.prepare()
# 获取请求的方法(HTTP 方法)
http_method = prepared_request.method
print(f"HTTP Method: {http_method}") # 输出:HTTP Method: POST
# 使用 Session 发送请求
with requests.Session() as session:
response = session.send(prepared_request)
只读属性,PreparedRequest对象中要发送的URL地址。
例:
import requests
url = 'https://httpbin.org/get'
params = {'key1': 'value1', 'key2': 'value2'}
# 创建一个 GET 请求对象
request = requests.Request('GET', url, params=params)
# 使用 prepare() 方法将请求对象转换为 PreparedRequest 对象
prepared_request = request.prepare()
# 获取请求的路径和查询字符串
path_url = prepared_request.url
print(f"Path: {url}") # 输出:Path: https://httpbin.org/get
表示 HTTP 请求的头部信息字典。头部信息包括了一系列键值对,每个键值对代表一个特定的头部字段和其对应的值。HTTP 头部常用于传递关于请求或响应的元数据。
说明:
元数据(metadata)指的是描述数据的数据。在计算机科学和信息学领域中,元信息是用于描述或解释其他数据的信息。它提供关于数据的特征、属性、结构或其他方面的信息,而不是直接包含实际的数据内容。
例:
import requests
url = 'https://httpbin.org/get'
headers = {'User-Agent': 'my-app/1.0', 'Accept': 'application/json'}
# 创建一个请求对象
request = requests.Request('GET', url, headers=headers)
# 使用 prepare() 方法将请求对象转换为 PreparedRequest 对象
prepared_request = request.prepare()
# 获取请求头部信息
request_headers = prepared_request.headers
print(f"Request Headers: {request_headers}")
输出:Request Headers: {'User-Agent': 'my-app/1.0', 'Accept': 'application/json'}
# 使用 Session 发送请求
with requests.Session() as session:
response = session.send(prepared_request)
body属性表示 HTTP 请求的主体部分。主体部分通常包含请求的实际数据,例如表单数据或 JSON 数据。body属性是一个字节字符串(bytes),其中包含了请求的主体数据。
例:
import requests
url = 'https://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
headers = {'content-type': 'application/json'}
# 创建一个请求对象
request = requests.Request('POST', url, data=payload, headers=headers)
# 使用prepare()方法将请求对象转换为PreparedRequest对象
prepared_request = request.prepare()
# 获取请求主体数据
request_body = prepared_request.body
print(f"Request Body: {request_body}")
输出:Request Body: key1=value1&key2=value2
# 使用Session发送请求
with requests.Session() as session:
response = session.send(prepared_request)
只读属性,表示 HTTP 请求的路径和查询字符串部分的组合。具体来说,它包括了请求 URL 中的路径部分以及可能存在的查询参数部分。
例:
import requests
url = 'https://httpbin.org/get'
params = {'key1': 'value1', 'key2': 'value2'}
# 创建一个 GET 请求对象
request = requests.Request('GET', url, params=params)
# 使用 prepare() 方法将请求对象转换为 PreparedRequest 对象
prepared_request = request.prepare()
# 获取请求的路径和查询字符串
path_url = prepared_request.path_url
print(f"Path and Query String: {path_url}")
# 输出:Path and Query String: /get?key1=value1&key2=value2
# 使用 Session 发送请求
# with requests.Session() as session:
# response = session.send(prepared_request)
hooks 属性是一个字典,用于存储回调函数,这些回调函数在请求的不同生命周期阶段被触发。这些生命周期阶段包括在发送请求之前、发送请求后以及在获取响应之后。
hooks 属性允许您附加回调函数,以便在请求的不同事件发生时执行自定义操作。例如,您可以在请求之前或响应之后执行某些额外的逻辑,如日志记录、修改请求或响应等。
示例:
import requests
# 定义一个回调函数,在请求之前执行
def before_request_callback(request, *args, **kwargs):
print("Before Request Callback")
# 定义一个回调函数,在响应之后执行
def after_response_callback(response, *args, **kwargs):
print("After Response Callback")
url = 'https://httpbin.org/get'
# 创建一个请求对象
request = requests.Request('GET', url)
# 使用 prepare() 方法将请求对象转换为 PreparedRequest 对象
prepared_request = request.prepare()
# 添加回调函数到 hooks 属性中
prepared_request.hooks = {'pre_request': before_request_callback, 'response': after_response_callback}
# 使用 Session 发送请求
with requests.Session() as session:
response = session.send(prepared_request)
print(response.text)
官方文档可查看:
开发接口 — Requests 2.18.1 文档