Перейти к основному содержимому

Route

Когда сетевой маршрут настраивается с помощью 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):
# переопределение заголовков
headers = {
**request.headers,
"foo": "foo-value", # установить заголовок "foo"
"bar": None # удалить заголовок "bar"
}
route.continue_(headers=headers)

page.route("**/*", handle)

Аргументы

  • headers Dict[str, str] (опционально)#

    Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.

  • method str (опционально)#

    Если установлено, изменяет метод запроса (например, GET или POST).

  • post_data str | bytes | Dict (опционально)#

    Если установлено, изменяет данные post запроса.

  • url str (опционально)#

    Если установлено, изменяет URL запроса. Новый URL должен иметь тот же протокол, что и оригинальный.

Возвращает

Детали

Опция headers применяется как к маршрутизированному запросу, так и к любым перенаправлениям, которые он инициирует. Однако url, method и post_data применяются только к оригинальному запросу и не переносятся на перенаправленные запросы.

route.continue_() немедленно отправит запрос в сеть, другие соответствующие обработчики не будут вызваны. Используйте route.fallback(), если вы хотите, чтобы следующий соответствующий обработчик в цепочке был вызван.


fallback

Добавлено в: v1.23 route.fallback

Продолжает запрос маршрута с возможными переопределениями. Метод аналогичен route.continue_(), с той разницей, что другие соответствующие обработчики будут вызваны перед отправкой запроса.

Использование

Когда несколько маршрутов соответствуют заданному шаблону, они выполняются в порядке, обратном их регистрации. Таким образом, последний зарегистрированный маршрут всегда может переопределить все предыдущие. В примере ниже запрос будет обработан сначала самым нижним обработчиком, затем он вернется к предыдущему, и в конце будет прерван первым зарегистрированным маршрутом.

page.route("**/*", lambda route: route.abort())  # Выполняется последним.
page.route("**/*", lambda route: route.fallback()) # Выполняется вторым.
page.route("**/*", lambda route: route.fallback()) # Выполняется первым.

Регистрация нескольких маршрутов полезна, когда вы хотите, чтобы отдельные обработчики обрабатывали разные виды запросов, например, вызовы API против ресурсов страницы или GET-запросы против POST-запросов, как в примере ниже.

# Обработка GET-запросов.
def handle_get(route):
if route.request.method != "GET":
route.fallback()
return
# Обработка только GET.
# ...

# Обработка POST-запросов.
def handle_post(route):
if route.request.method != "POST":
route.fallback()
return
# Обработка только POST.
# ...

page.route("**/*", handle_get)
page.route("**/*", handle_post)

Также можно изменить запрос, возвращаясь к следующему обработчику, таким образом промежуточный обработчик маршрута может изменить url, метод, заголовки и postData запроса.

def handle(route, request):
# переопределение заголовков
headers = {
**request.headers,
"foo": "foo-value", # установить заголовок "foo"
"bar": None # удалить заголовок "bar"
}
route.fallback(headers=headers)

page.route("**/*", handle)

Используйте route.continue_(), чтобы немедленно отправить запрос в сеть, другие соответствующие обработчики не будут вызваны в этом случае.

Аргументы

  • headers Dict[str, str] (опционально)#

    Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.

  • method str (опционально)#

    Если установлено, изменяет метод запроса (например, GET или POST).

  • post_data str | bytes | Dict (опционально)#

    Если установлено, изменяет данные post запроса.

  • url str (опционально)#

    Если установлено, изменяет 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 | Dict (опционально)#

    Позволяет установить данные post запроса. Если параметр данных является объектом, он будет сериализован в строку json, и заголовок content-type будет установлен в application/json, если не установлен явно. В противном случае заголовок content-type будет установлен в application/octet-stream, если не установлен явно.

  • timeout float (опционально) Добавлено в: v1.33#

    Тайм-аут запроса в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0, чтобы отключить тайм-аут.

  • url str (опционально)#

    Если установлено, изменяет 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 Dict (опционально) Добавлено в: v1.29#

    JSON-ответ. Этот метод установит тип содержимого в application/json, если не установлен.

  • path Union[str, pathlib.Path] (опционально)#

    Путь к файлу для ответа. Тип содержимого будет определен из расширения файла. Если path является относительным путем, то он разрешается относительно текущего рабочего каталога.

  • response APIResponse (опционально) Добавлено в: v1.15#

    APIResponse для выполнения запроса маршрута. Отдельные поля ответа (такие как заголовки) могут быть переопределены с помощью опций выполнения.

  • status int (опционально)#

    Код статуса ответа, по умолчанию 200.

Возвращает


Свойства

request

Добавлено до версии v1.9 route.request

Запрос, который будет маршрутизирован.

Использование

route.request

Возвращает