跳至主要内容

路由

每当使用 page.route()browser_context.route() 设置网络路由时,Route 对象允许处理该路由。

了解更多关于 网络 的信息。


方法

abort

在 v1.9 之前添加 route.abort

中止路由的请求。

用法

route.abort()
route.abort(**kwargs)

参数

  • error_code str (可选)#

    可选错误代码。默认为 failed,可以是以下之一

    • 'aborted' - 操作被中止(由于用户操作)
    • 'accessdenied' - 拒绝访问除网络之外的资源的权限
    • 'addressunreachable' - IP 地址不可达。这通常意味着没有到指定主机或网络的路由。
    • 'blockedbyclient' - 客户端选择阻止请求。
    • 'blockedbyresponse' - 请求失败,因为响应连同未满足的要求一起传递(例如,“X-Frame-Options”和“Content-Security-Policy”祖先检查)。
    • 'connectionaborted' - 连接超时,因为未收到发送数据的 ACK。
    • 'connectionclosed' - 连接已关闭(对应于 TCP FIN)。
    • 'connectionfailed' - 连接尝试失败。
    • 'connectionrefused' - 连接尝试被拒绝。
    • 'connectionreset' - 连接已重置(对应于 TCP RST)。
    • 'internetdisconnected' - 互联网连接已断开。
    • 'namenotresolved' - 无法解析主机名。
    • 'timedout' - 操作超时。
    • 'failed' - 发生一般性错误。

返回值


continue_

在 v1.9 之前添加 route.continue_

使用可选覆盖发送路由的请求到网络。

用法

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)

参数

  • headers Dict[str, str] (可选)#

    如果设置,则更改请求 HTTP 标头。标头值将转换为字符串。

  • method str (可选)#

    如果设置,则更改请求方法(例如 GET 或 POST)。

  • post_data str | bytes | 可序列化 (可选)#

    如果设置,则更改请求的发布数据。

  • url str (可选)#

    如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。

返回值

详情

请注意,任何覆盖(例如 urlheaders)仅适用于正在路由的请求。如果此请求导致重定向,则覆盖不会应用于新的重定向请求。如果要通过重定向传播标头,请改用 route.fetch()route.fulfill() 的组合。

route.continue_() 将立即将请求发送到网络,其他匹配的处理程序将不会被调用。如果您希望调用链中的下一个匹配处理程序,请使用 route.fallback()


fallback

添加于:v1.23 route.fallback

使用可选覆盖继续路由的请求。此方法类似于 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.

当您希望单独的处理程序处理不同类型的请求时,注册多个路由非常有用,例如 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)

也可以在回退到后续处理程序时修改请求,这样中间路由处理程序可以修改请求的 url、方法、标头和 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)

使用 route.continue_() 立即将请求发送到网络,在这种情况下,其他匹配的处理程序将不会被调用。

参数

  • headers Dict[str, str] (可选)#

    如果设置,则更改请求 HTTP 标头。标头值将转换为字符串。

  • method str (可选)#

    如果设置,则更改请求方法(例如 GET 或 POST)。

  • post_data str | bytes | 可序列化 (可选)#

    如果设置,则更改请求的发布数据。

  • url str (可选)#

    如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。更改 URL 不会影响路由匹配,所有路由都使用原始请求 URL 进行匹配。

返回值


fetch

添加于:v1.29 route.fetch

执行请求并获取结果,而无需满足它,以便可以修改响应,然后满足它。

用法

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)

参数

  • headers Dict[str, str] (可选)#

    如果设置,则更改请求 HTTP 标头。标头值将转换为字符串。

  • max_redirects int (可选)添加于:v1.31#

    将自动跟随的请求重定向的最大数量。如果超过此数量,将抛出错误。默认为 20。传递 0 以不跟随重定向。

  • max_retries int (可选)添加于:v1.46#

    网络错误应重试的次数。目前仅重试 ECONNRESET 错误。不基于 HTTP 响应代码重试。如果超过限制,将抛出错误。默认为 0 - 不重试。

  • method str (可选)#

    如果设置,则更改请求方法(例如 GET 或 POST)。

  • post_data str | bytes | 可序列化 (可选)#

    允许设置请求的发布数据。如果数据参数是对象,它将被序列化为 json 字符串,并且如果未显式设置,则 content-type 标头将设置为 application/json。否则,如果未显式设置,则 content-type 标头将设置为 application/octet-stream

  • timeout float (可选)添加于:v1.33#

    请求超时(毫秒)。默认为 30000(30 秒)。传递 0 以禁用超时。

  • url str (可选)#

    如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。

返回值

详情

请注意,headers 选项将应用于获取的请求以及由此发起的任何重定向。如果您只想将 headers 应用于原始请求,而不应用于重定向,请改用 route.continue_()


fulfill

在 v1.9 之前添加 route.fulfill

使用给定的响应来满足路由的请求。

用法

使用 404 响应满足所有请求的示例

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"))

参数

  • body str | bytes (可选)#

    响应体。

  • content_type str (可选)#

    如果设置,则等效于设置 Content-Type 响应头。

  • headers Dict[str, str] (可选)#

    响应头。头值将转换为字符串。

  • json 可序列化 (可选)添加于:v1.29#

    JSON 响应。如果未设置,此方法会将内容类型设置为 application/json

  • path Union[str, pathlib.Path] (可选)#

    要响应的文件路径。内容类型将从文件扩展名推断。如果 path 是相对路径,则相对于当前工作目录解析。

  • response APIResponse (可选)新增于:v1.15#

    APIResponse 用于满足路由的请求。可以使用 fulfill 选项覆盖响应的各个字段(例如头)。

  • status int (可选)#

    响应状态码,默认为 200

返回值


属性

request

在 v1.9 之前添加 route.request

要路由的请求。

用法

route.request

返回值