Python第三方requests库PreparedRequest对象详解(5/6)

requests.PreparedRequest类

它用于表示一个经过预处理但尚未发送的请求。

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)

方法

1、prepare(method=None, url=None, headers=None, files=None, data=None, params=None, auth=None, cookies=None, hooks=None, json=None)

先构造一个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) # 输出

2、prepare_method(method)

这个方法用于设置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)

3、prepare_url(url, params)

这个方法用于设置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)

4、prepare_headers(headers)

用于设置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'}

5、prepare_body(data, files, json=None)

由于这是一个内部方法,它并没有被广泛文档化,并且可能在将来的库版本中发生变化。在正常的请求流程中,你通常不需要直接调用这个方法。

参数说明:

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)

6、prepare_auth(auth, url='')

用于准备请求的认证信息。这个方法通常用于设置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)

7、prepare_cookies(cookies)

这个方法用于设置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)

8、prepare_hooks(hooks)

在Python的requests库中,PreparedRequest.prepare_hooks(hooks)方法用于准备请求的钩子(hooks)。钩子是一种机制,允许你在请求的不同阶段插入自定义逻辑。

参数说明:

hooks: 一个字典,包含请求钩子的设置。每个键是一个请求阶段名称(如'response'),对应的值是一个函数或可调用对象。

这个方法主要用于当你需要在请求的不同阶段执行自定义逻辑时。

9、register_hook(event, hook)

注册一个钩子函数。

例:

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

10、deregister_hook(event, hook)

这个方法用于从请求中注销之前注册的事件钩子。钩子存在返回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)

参数

1、method = None

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)

2、url = None

只读属性,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

3、headers = None

表示 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)

4、body = None

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)

5、path_url

只读属性,表示 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)

6、hooks = None

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 文档

你可能感兴趣的:(python,开发语言)