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”