Рубрики
Без рубрики

Начало работы с httpx, часть 1: Создание клиента Python Ress (синхронная версия)

Httpx – это современная библиотека клиента HTTP для Python. Его интерфейс похож на старый режим ожидания … Помечено Python, httpx, Pythonpoetry.

Httpx Это современная библиотека клиента HTTP для Python. Его интерфейс похож на старый режим ожидания Запросы , но он поддерживает асинхронные HTTP-запросы, используя Python’s асинсио Библиотека (или Trio ). Другими словами, в то время как ваша программа ждет http-запроса для завершения, другая работа не должна быть заблокирована.

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

Взаимодействовать с Httpx. Давайте построим мини-проект под названием Pypedia Отказ Это будет инструмент командной строки для списка нескольких статей, связанных с Python, из Википедия Отказ

Поэзия Облегчает Python Project и управление зависимостями, поэтому я использую это, чтобы быстро получить проект вверх и запустить. Если новый для поэзии, вы можете оценить статья, в которой я представляю это Отказ

Настройка с поэзией

poetry new --src pypedia
cd pypedia
poetry add httpx

Две функции и командный бегун

В SRC/Pypedia каталог, создайте файл Python под названием Синхронно .py Отказ

"""Proof-of-concept Wikipedia search tool."""
import logging
import time

import httpx

EMAIL = "your_email@provider"  # or Github URL or other identifier
USER_AGENT = {"user-agent": f"pypedia/0.1.0 ({EMAIL})"}

logging.basicConfig(filename="syncpedia.log", filemode="w", level=logging.INFO)
LOG = logging.getLogger("syncpedia")


def search(query, limit=100, client=None):
    """Search Wikipedia, returning a JSON list of pages."""
    if not client:
        client = httpx
    LOG.info(f"Start query '{query}': {time.strftime('%X')}")
    url = "https://en.wikipedia.org/w/rest.php/v1/search/page"
    params = {"q": query, "limit": limit}
    response = client.get(url, params=params)
    LOG.info(f"End query '{query}': {time.strftime('%X')}")
    return response


def list_articles(queries):
    """Execute several Wikipedia searches."""
    with httpx.Client(headers=USER_AGENT) as client:
        responses = (search(query, client=client) for query in queries)
    results = (response.json()["pages"] for response in responses)
    # results = (response.json() for response in responses)
    return dict(zip(queries, results))


def run():
    """Command entry point."""
    queries = [
        "linksto:Python_(programming_language)",
        "incategory:Computer_programming",
        "incategory:Programming_languages",
        "incategory:Python_(programming_language)",
        "incategory:Python_web_frameworks",
        "incategory:Python_implementations",
        "incategory:Programming_languages_created_in_1991",
        "incategory:Computer_programming_stubs",
    ]
    results = list_articles(queries)
    for query, articles in results.items():
        print(f"\n*** {query} ***")
        for article in articles:
            print(f"{article['title']}: {article['excerpt']}")

Таким образом, указанное выше имеет две значительные функции и командный бегун.

Использование Client.get ()

Поиск Функция принимает многоразовый Httpx клиент Экземпляр и строка запроса, затем выполняет Клиент Получить запрос к Wikipedia поиск конечной точки Отказ

Httpx клиент передается в Поиск () Функция как клиент Переменная, поэтому мы можем использовать методы, такие как Client.get () Прохождение двух аргументов: URL и Пармы Отказ Какой бы ключ: ценные пары находятся в Пармы Dict состоит из строки запроса, добавленной к URL-адресу, например Q. (Условия поиска Википедии) или Ограничить Отказ

В случае, если ранее существующий клиент не передается Поиск () Последующие запросы будут использовать httpx.get () Отказ Это позволяет легко использовать Поиск () Сам по себе и проверим его в изолированной моде.

httpx. Клиент в контексте менеджера

list_articles () Функция открывает клиент HTTPX в качестве менеджера контекста, так что очистка гарантируется и автоматическая. Он принимает один параметр, Запросы , а затем итерат за этот список, звонив Поиск () с каждым запросом. Это делает это Внутри менеджера контекста . Таким образом, все Client.get () звонки в Поиск () Функция должна выиграть от повторного использования единого HTTP постоянное соединение Отказ

Для тех, кто знаком с Запросы Это эквивалент Запрашивает объект сеанса Отказ

Httpx Расширенное руководство по использованию Имеет отличное обоснование и инструкции для использования клиента.

Включить командный бегун

Беги () Функция выполняет все, что мы хотим выполнить, когда вызывается как скрипт. В этом случае он создает список условий поиска, затем отправляет список на list_articles () Затем анализируют и печатают результат.

С поэзией точка входа для скрипта определяется в pyproject.toml. . Итак, мы добавляем это к этому файлу:

[tool.poetry.scripts]
syncpedia = "pypedia.synchronous:run"

Итак, скрипт Синхридиция позвонит Беги Функция Синхронный Подмодуль пакета Pypedia Отказ

poetry install

Синхронное исполнение

Бежать:

poetry run syncpedia

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

Призывы к API Wikipedia произошли синхронно, в последовательности. Один завершен до начала следующего. Это можно увидеть в файле журнала.

$ cat syncpedia.log
INFO:root:Start query 'linksto:Python_(programming_language)': 05:39:16
INFO:root:End query 'linksto:Python_(programming_language)': 05:39:17
INFO:root:Start query 'incategory:Computer_programming': 05:39:17
INFO:root:End query 'incategory:Computer_programming': 05:39:18
INFO:root:Start query 'incategory:Programming_languages': 05:39:18
INFO:root:End query 'incategory:Programming_languages': 05:39:19
INFO:root:Start query 'incategory:Python_(programming_language)': 05:39:19
INFO:root:End query 'incategory:Python_(programming_language)': 05:39:19
INFO:root:Start query 'incategory:Python_web_frameworks': 05:39:19
INFO:root:End query 'incategory:Python_web_frameworks': 05:39:20
INFO:root:Start query 'incategory:Python_implementations': 05:39:20
INFO:root:End query 'incategory:Python_implementations': 05:39:20
INFO:root:Start query 'incategory:Programming_languages_created_in_1991': 05:39:20
INFO:root:End query 'incategory:Programming_languages_created_in_1991': 05:39:20
INFO:root:Start query 'incategory:Computer_programming_stubs': 05:39:20
INFO:root:End query 'incategory:Computer_programming_stubs': 05:39:21

В приведенном выше случае каждый вызов занял 1 секунду или меньше, выполняя в четкий порядок.

Другими словами, все должны были ждать в очереди.

Httpx Имеет возможность звонить асинхронно, в которой каждый вызов не нужно ждать его очередь в очереди. Это может потенциально иметь преимущества производительности. Мы рассмотрим асинхронные возможности позже в серии Отказ

На данный момент мы не можем забыть писать тесты, и следующая статья будет заниматься этим.

Оригинал: “https://dev.to/bowmanjd/getting-started-with-httpx-building-a-python-rest-client-234n”