Route
无论何时使用 page.route() 或 browser_context.route() 设置网络路由,Route
对象都允许处理该路由。
了解有关网络的更多信息。
方法
abort
在 v1.9 之前添加中止路由的请求。
用法
route.abort()
route.abort(**kwargs)
参数
-
可选的错误代码。默认为
failed
,可以是以下之一:'aborted'
- 操作已中止(由于用户操作)'accessdenied'
- 拒绝访问除网络之外的资源'addressunreachable'
- IP 地址无法访问。这通常意味着无法路由到指定的宿主或网络。'blockedbyclient'
- 客户端选择阻止请求。'blockedbyresponse'
- 请求失败,因为响应附带了不满足的要求(例如,'X-Frame-Options' 和 'Content-Security-Policy' 祖先检查)。'connectionaborted'
- 由于未收到发送数据的 ACK,连接超时。'connectionclosed'
- 连接已关闭(对应于 TCP FIN)。'connectionfailed'
- 连接尝试失败。'connectionrefused'
- 连接尝试被拒绝。'connectionreset'
- 连接已重置(对应于 TCP RST)。'internetdisconnected'
- Internet 连接已断开。'namenotresolved'
- 无法解析主机名。'timedout'
- 操作超时。'failed'
- 发生了通用故障。
返回
continue_
在 v1.9 之前添加使用可选的覆盖项将路由的请求发送到网络。
用法
- 同步
- 异步
def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
route.continue_(headers=headers)
page.route("**/*", handle)
async def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
await route.continue_(headers=headers)
await page.route("**/*", handle)
参数
-
如果设置,则更改请求的 HTTP 头部。头部值将被转换为字符串。
-
如果设置,则更改请求方法(例如 GET 或 POST)。
-
post_data
str | bytes | Dict (可选)#如果设置,则更改请求的 POST 数据。
-
如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。
返回
详细信息
headers
选项适用于路由的请求以及其发起的任何重定向。但是,url
、method
和 post_data
仅适用于原始请求,不会延续到重定向请求。
route.continue_() 将立即把请求发送到网络,不会调用其他匹配的处理程序。如果您希望调用链中的下一个匹配处理程序,请使用 route.fallback()。
无法使用此方法覆盖 Cookie
头部。如果提供了值,它将被忽略,Cookie 将从浏览器 Cookie 存储中加载。要设置自定义 Cookie,请使用 browser_context.add_cookies()。
fallback
添加于:v1.23使用可选的覆盖项继续路由的请求。此方法类似于 route.continue_(),不同之处在于在发送请求之前会调用其他匹配的处理程序。
用法
当多个路由匹配给定模式时,它们按照与其注册相反的顺序运行。这样,最后注册的路由总是可以覆盖所有先前的路由。在下面的示例中,请求将首先由最下面的处理程序处理,然后它将回退到前一个处理程序,最后由第一个注册的路由中止。
- 同步
- 异步
page.route("**/*", lambda route: route.abort()) # Runs last.
page.route("**/*", lambda route: route.fallback()) # Runs second.
page.route("**/*", lambda route: route.fallback()) # Runs first.
await page.route("**/*", lambda route: route.abort()) # Runs last.
await page.route("**/*", lambda route: route.fallback()) # Runs second.
await page.route("**/*", lambda route: route.fallback()) # Runs first.
注册多个路由在您希望不同的处理程序处理不同类型的请求时非常有用,例如 API 调用与页面资源,或如下面示例所示的 GET 请求与 POST 请求。
- 同步
- 异步
# Handle GET requests.
def handle_get(route):
if route.request.method != "GET":
route.fallback()
return
# Handling GET only.
# ...
# Handle POST requests.
def handle_post(route):
if route.request.method != "POST":
route.fallback()
return
# Handling POST only.
# ...
page.route("**/*", handle_get)
page.route("**/*", handle_post)
# Handle GET requests.
async def handle_get(route):
if route.request.method != "GET":
await route.fallback()
return
# Handling GET only.
# ...
# Handle POST requests.
async def handle_post(route):
if route.request.method != "POST":
await route.fallback()
return
# Handling POST only.
# ...
await page.route("**/*", handle_get)
await page.route("**/*", handle_post)
在回退到后续处理程序时,也可以修改请求,这样中间的路由处理程序就可以修改请求的 url、method、headers 和 postData。
- 同步
- 异步
def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
route.fallback(headers=headers)
page.route("**/*", handle)
async def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
await route.fallback(headers=headers)
await page.route("**/*", handle)
使用 route.continue_() 将立即把请求发送到网络,在这种情况下不会调用其他匹配的处理程序。
参数
-
如果设置,则更改请求的 HTTP 头部。头部值将被转换为字符串。
-
如果设置,则更改请求方法(例如 GET 或 POST)。
-
post_data
str | bytes | Dict (可选)#如果设置,则更改请求的 POST 数据。
-
如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。更改 URL 不会影响路由匹配,所有路由都是使用原始请求 URL 匹配的。
返回
fetch
添加于:v1.29执行请求并获取结果,但不完成它,以便可以修改响应,然后再完成。
用法
- 同步
- 异步
def handle(route):
response = route.fetch()
json = response.json()
json["message"]["big_red_dog"] = []
route.fulfill(response=response, json=json)
page.route("https://dog.ceo/api/breeds/list/all", handle)
async def handle(route):
response = await route.fetch()
json = await response.json()
json["message"]["big_red_dog"] = []
await route.fulfill(response=response, json=json)
await page.route("https://dog.ceo/api/breeds/list/all", handle)
参数
-
如果设置,则更改请求的 HTTP 头部。头部值将被转换为字符串。
-
max_redirects
int (可选)添加于:v1.31#自动跟随的最大请求重定向次数。如果超出此次数,将抛出错误。默认为
20
。传递0
表示不跟随重定向。 -
max_retries
int (可选)添加于:v1.46#网络错误应重试的最大次数。目前仅重试
ECONNRESET
错误。不根据 HTTP 响应码重试。如果超出限制,将抛出错误。默认为0
- 不重试。 -
如果设置,则更改请求方法(例如 GET 或 POST)。
-
post_data
str | bytes | Dict (可选)#允许设置请求的 POST 数据。如果 data 参数是对象,它将被序列化为 json 字符串,并且如果没有显式设置,
content-type
头部将设置为application/json
。否则,如果没有显式设置,content-type
头部将设置为application/octet-stream
。 -
请求超时时间(毫秒)。默认为
30000
(30 秒)。传递0
表示禁用超时。 -
如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。
返回
详细信息
请注意,headers
选项将应用于获取的请求以及由此发起的任何重定向。如果您只想将 headers
应用于原始请求而不是重定向,请改为查看 route.continue_()。
fulfill
在 v1.9 之前添加使用给定响应完成路由的请求。
用法
将所有请求完成为 404 响应的示例
- 同步
- 异步
page.route("**/*", lambda route: route.fulfill(
status=404,
content_type="text/plain",
body="not found!"))
await page.route("**/*", lambda route: route.fulfill(
status=404,
content_type="text/plain",
body="not found!"))
提供静态文件的示例
- 同步
- 异步
page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
await page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
参数
-
响应体。
-
如果设置,等同于设置
Content-Type
响应头部。 -
响应头部。头部值将被转换为字符串。
-
JSON 响应。如果未设置 content type,此方法会将其设置为
application/json
。 -
path
Union[str, pathlib.Path] (可选)#用于响应的文件路径。内容类型将从文件扩展名推断。如果
path
是相对路径,则它是相对于当前工作目录解析的。 -
response
APIResponse (可选)添加于:v1.15#用于完成路由请求的 APIResponse。可以使用完成选项覆盖响应的各个字段(例如 headers)。
-
响应状态码,默认为
200
。
返回
属性
request
在 v1.9 之前添加一个待路由的请求。
用法
route.request
返回