Python: сетевые приложения

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 21 дек 2023, 19:24

Книга: Python для сетевых инженеров
Natasha Samoylenko
мая 31, 2023
745 страниц
По ссылке можно или читать HTML, либо скачать себе в PDF или Epub на выбор.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 16:44

Очень хорошая (широкий охват, компактность, никакой воды...) + очень свежая статьяотносительно HTTP-клиентов из области Web-приложений: The best Python HTTP clients for 2022 :!:
The Basics (urllib.request)
1. urllib3
2. Requests
3. aiohttp
4. GRequests
5. HTTPX
6. Uplink
Feature Comparison
Conclusion
Тут, по этому обзору, ничего ни убавить, ни прибавить ... и остаётся только тупо проверить примеры на реализуемость.
Это готовый базис для реализации собственных клиентских WEB-приложений.
P.S. Кроме всего прочего, URL для приверки примеров кода, что бывает непросто найти для начала тестирования проектов...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 17:24

Olej писал(а):
23 дек 2023, 16:44
urllib.request
Если вы знакомы со стандартной библиотекой Python, то вы, вероятно, уже знаете о запутанной истории модулей urllib и urllib2 внутри нее. urllib2 (исходный модуль) в Python 3 был разделен на отдельные модули: urllib.request и urllib.error.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ cat urllib.get.py 
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
Обратите внимание, что нам пришлось использовать модуль JSON для преобразования этого в JSON, поскольку read() возвращает строку.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ python3 urllib.get.py 
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ cat urllib.post.py 
import json
from urllib import request, parse

data = {
    "name": "Obi-Wan Kenobi",
    "height": "182",
    "mass": "77",
    "hair_color": "auburn, white",
    "skin_color": "fair",
    "eye_color": "blue-gray",
    "birth_year": "57BBY",
    "gender": "male"
}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ python3 urllib.post.py 
{'args': {}, 'data': '{"name": "Obi-Wan Kenobi", "height": "182", "mass": "77", "hair_color": "auburn, white", "skin_color": "fair", "eye_color": "blue-gray", "birth_year": "57BBY", "gender": "male"}', 'files': {}, 'form': {}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '177', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.10', 'X-Amzn-Trace-Id': 'Root=1-6586e5e4-7f37731833e0b15d5349428b'}, 'json': {'birth_year': '57BBY', 'eye_color': 'blue-gray', 'gender': 'male', 'hair_color': 'auburn, white', 'height': '182', 'mass': '77', 'name': 'Obi-Wan Kenobi', 'skin_color': 'fair'}, 'origin': '45.9.31.32', 'url': 'https://httpbin.org/post'}
Вложения
urllib.post.py
(527 байт) 8 скачиваний
urllib.get.py
(170 байт) 8 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 17:37

Olej писал(а):
23 дек 2023, 16:44
1. urllib3
Пакет urllib3, как это ни странно, не является частью стандартной библиотеки, а является отдельным клиентским пакетом HTTP, основанным на urllib. Он предоставляет недостающие функции, такие как объединение пулов соединений, проверка TLS и безопасность потоков. В конечном итоге это приводит к повышению производительности приложений, выполняющих много вызовов, таких как парсинг веб-страниц, поскольку они будут повторно использовать соединения с хостами, а не создавать новые.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ cat urllib3.get.py 
import urllib3
import json

http = urllib3.PoolManager()
r = http.request('GET', 'https://swapi.dev/api/starships/9/')

print(json.loads(r.data.decode('utf-8')))

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ python3 urllib3.get.py 
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ cat python3 urllib3.post.py 
cat: python3: Нет такого файла или каталога
import json
import urllib3

data = {
    "name": "Obi-Wan Kenobi",
    "height": "182",
    "mass": "77",
    "hair_color": "auburn, white",
    "skin_color": "fair",
    "eye_color": "blue-gray",
    "birth_year": "57BBY",
    "gender": "male"
}

http = urllib3.PoolManager()

encoded_data = json.dumps(data).encode('utf-8')

r = http.request(
    'POST',
    'https://httpbin.org/post',
    body=encoded_data,
    headers={'Content-Type': 'application/json'}
)

print(json.loads(r.data.decode('utf-8')))

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ python3 urllib3.post.py 
{'args': {}, 'data': '{"name": "Obi-Wan Kenobi", "height": "182", "mass": "77", "hair_color": "auburn, white", "skin_color": "fair", "eye_color": "blue-gray", "birth_year": "57BBY", "gender": "male"}', 'files': {}, 'form': {}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '177', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-urllib3/1.26.5', 'X-Amzn-Trace-Id': 'Root=1-6586ec80-34e2b8c00d7398f1368613e0'}, 'json': {'birth_year': '57BBY', 'eye_color': 'blue-gray', 'gender': 'male', 'hair_color': 'auburn, white', 'height': '182', 'mass': '77', 'name': 'Obi-Wan Kenobi', 'skin_color': 'fair'}, 'origin': '45.9.31.32', 'url': 'https://httpbin.org/post'}
Вложения
urllib3.post.py
(507 байт) 8 скачиваний
urllib3.get.py
(162 байт) 8 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 17:41

Olej писал(а):
23 дек 2023, 16:44
2. Requests
Пакет Requests пользуется большой популярностью в сообществе Python: по данным PePy, его загружают более 110 миллионов раз в месяц. В основной документации urllib.request он также рекомендуется как «клиентский интерфейс HTTP более высокого уровня».

Работать с запросами невероятно просто, и поэтому большинство разработчиков сообщества Python используют его в качестве предпочтительного HTTP-клиента. Он поддерживается Python Software Foundation, имеет более 45 тысяч звезд на Github и зависит от многих других библиотек Python, таких как gRPC и pandas.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ cat requests.get.py 
import requests

r = requests.get('https://swapi.dev/api/starships/9/')
print(r.json())
Вот, замчательный клиент HTTP с разборщиком JSON ответа - в 2 строки кода.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ python3 requests.get.py 
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ cat requests.post.py 
import requests

data = {
    "name": "Obi-Wan Kenobi",
    "height": "182",
    "mass": "77",
    "hair_color": "auburn, white",
    "skin_color": "fair",
    "eye_color": "blue-gray",
    "birth_year": "57BBY",
    "gender": "male"
}

r = requests.post('https://httpbin.org/post', json=data)
print(r.json())

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python$ python3 requests.post.py 
{'args': {}, 'data': '{"name": "Obi-Wan Kenobi", "height": "182", "mass": "77", "hair_color": "auburn, white", "skin_color": "fair", "eye_color": "blue-gray", "birth_year": "57BBY", "gender": "male"}', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Content-Length': '177', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.28.2', 'X-Amzn-Trace-Id': 'Root=1-6586f104-66289eff3a49a66d5f792948'}, 'json': {'birth_year': '57BBY', 'eye_color': 'blue-gray', 'gender': 'male', 'hair_color': 'auburn, white', 'height': '182', 'mass': '77', 'name': 'Obi-Wan Kenobi', 'skin_color': 'fair'}, 'origin': '45.9.31.32', 'url': 'https://httpbin.org/post'}
Вложения
requests.post.py
(310 байт) 8 скачиваний
requests.get.py
(88 байт) 8 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 19:34

Olej писал(а):
23 дек 2023, 16:44
3. aiohttp
Asynchronous HTTP Client/Server for asyncio and Python.
aiohttp — это пакет, содержащий как клиентскую, так и серверную структуру, а это означает, что он может хорошо подходить для API, который также выполняет запросы в другом коде. Он имеет 11 тысяч звезд на Github, и на его основе построен ряд сторонних библиотек.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ 
python3 aiohttp.get.py 
Traceback (most recent call last):
  File "/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP/aiohttp.get.py", line 1, in <module>
    import aiohttp
ModuleNotFoundError: No module named 'aiohttp'
Тут не всё так гладко... по крайней мере в вашей привычной/обычной Python рабочей среде...
Но этому делу легко помочь, за счёт богатства и лёгкости использования Python репозиториев:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ pip install aiohttp
Defaulting to user installation because normal site-packages is not writeable
Collecting aiohttp
  Downloading aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 1.2 MB/s eta 0:00:00
Collecting aiosignal>=1.1.2
  Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)
Collecting frozenlist>=1.1.1
  Downloading frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (239 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 239.5/239.5 KB 3.0 MB/s eta 0:00:00
Collecting multidict<7.0,>=4.5
  Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 114.5/114.5 KB 2.4 MB/s eta 0:00:00
Requirement already satisfied: attrs>=17.3.0 in /home/olej/.local/lib/python3.10/site-packages (from aiohttp) (23.1.0)
Collecting async-timeout<5.0,>=4.0
  Downloading async_timeout-4.0.3-py3-none-any.whl (5.7 kB)
Collecting yarl<2.0,>=1.0
  Downloading yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (301 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 301.6/301.6 KB 3.0 MB/s eta 0:00:00
Requirement already satisfied: idna>=2.0 in /usr/lib/python3/dist-packages (from yarl<2.0,>=1.0->aiohttp) (3.3)
Installing collected packages: multidict, frozenlist, async-timeout, yarl, aiosignal, aiohttp
Successfully installed aiohttp-3.9.1 aiosignal-1.3.1 async-timeout-4.0.3 frozenlist-1.4.1 multidict-6.0.4 yarl-1.9.4
И дальше всё с тем же успехом:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 aiohttp.get.py 
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}
Вы можете видеть, что объект aiohttp.ClientSession() использует синтаксис, аналогичный Requests, но общий код намного сложнее, чем в предыдущих примерах, и теперь у нас есть вызовы методов с использованием async и await, а также дополнительный импорт модуля для asyncio. Документация aiohttp дает хорошее представление о том, почему необходим весь этот дополнительный код по сравнению, скажем, с Requests.

Если вы не знакомы с концепциями асинхронного программирования, потребуется некоторое время, но в конечном итоге это означает, что можно сделать несколько запросов одновременно, не дожидаясь, пока каждый из них вернет ответ один за другим. В ситуациях, когда мы делаем только один запрос, это может не вызывать беспокойства, но если нам нужно сделать десятки или даже тысячи запросов, все время ожидания ответа ЦП может быть лучше потрачено на что-то другое (например, на создание еще одного запроса). запрос!). Мы не хотим платить за циклы процессора, когда просто ждем.
И, соответственно POST:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 aiohttp.post.py 
{'args': {}, 'data': '{"name": "Obi-Wan Kenobi", "height": "182", "mass": "77", "hair_color": "auburn, white", "skin_color": "fair", "eye_color": "blue-gray", "birth_year": "57BBY", "gender": "male"}', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Content-Length': '177', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'Python/3.10 aiohttp/3.9.1', 'X-Amzn-Trace-Id': 'Root=1-65870c3c-7de13c1a46e4598e00359f4b'}, 'json': {'birth_year': '57BBY', 'eye_color': 'blue-gray', 'gender': 'male', 'hair_color': 'auburn, white', 'height': '182', 'mass': '77', 'name': 'Obi-Wan Kenobi', 'skin_color': 'fair'}, 'origin': '45.9.31.32', 'url': 'https://httpbin.org/post'}
Если вы не знакомы с концепциями асинхронного программирования, потребуется некоторое время, но в конечном итоге это означает, что можно сделать несколько запросов одновременно, не дожидаясь, пока каждый из них вернет ответ один за другим. В ситуациях, когда мы делаем только один запрос, это может не вызывать беспокойства, но если нам нужно сделать десятки или даже тысячи запросов, все время ожидания ответа ЦП может быть лучше потрачено на что-то другое (например, на создание еще одного запроса). запрос!). Мы не хотим платить за циклы процессора, когда просто ждем. В качестве примера давайте рассмотрим код, который ищет данные для первых 50 звездолетов из API Star Wars.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ time python3 aiohttp.group.py 
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Star Destroyer', 'model': 'Imperial I-class Star Destroyer', 'manufacturer': 'Kuat Drive Yards', 'cost_in_credits': '150000000', 'length': '1,600', 'max_atmosphering_speed': '975', 'crew': '47,060', 'passengers': 'n/a', 'cargo_capacity': '36000000', 'consumables': '2 years', 'hyperdrive_rating': '2.0', 'MGLT': '60', 'starship_class': 'Star Destroyer', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-10T15:08:19.848000Z', 'edited': '2014-12-20T21:23:49.870000Z', 'url': 'https://swapi.dev/api/starships/3/'}
{'detail': 'Not found'}
{'name': 'Y-wing', 'model': 'BTL Y-wing', 'manufacturer': 'Koensayr Manufacturing', 'cost_in_credits': '134999', 'length': '14', 'max_atmosphering_speed': '1000km', 'crew': '2', 'passengers': '0', 'cargo_capacity': '110', 'consumables': '1 week', 'hyperdrive_rating': '1.0', 'MGLT': '80', 'starship_class': 'assault starfighter', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-12T11:00:39.817000Z', 'edited': '2014-12-20T21:23:49.883000Z', 'url': 'https://swapi.dev/api/starships/11/'}
{'name': 'CR90 corvette', 'model': 'CR90 corvette', 'manufacturer': 'Corellian Engineering Corporation', 'cost_in_credits': '3500000', 'length': '150', 'max_atmosphering_speed': '950', 'crew': '30-165', 'passengers': '600', 'cargo_capacity': '3000000', 'consumables': '1 year', 'hyperdrive_rating': '2.0', 'MGLT': '60', 'starship_class': 'corvette', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/3/', 'https://swapi.dev/api/films/6/'], 'created': '2014-12-10T14:20:33.369000Z', 'edited': '2014-12-20T21:23:49.867000Z', 'url': 'https://swapi.dev/api/starships/2/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'J-type diplomatic barge', 'model': 'J-type diplomatic barge', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps, Nubia Star Drives', 'cost_in_credits': '2000000', 'length': '39', 'max_atmosphering_speed': '2000', 'crew': '5', 'passengers': '10', 'cargo_capacity': 'unknown', 'consumables': '1 year', 'hyperdrive_rating': '0.7', 'MGLT': 'unknown', 'starship_class': 'Diplomatic barge', 'pilots': [], 'films': ['https://swapi.dev/api/films/5/'], 'created': '2014-12-20T11:05:51.237000Z', 'edited': '2014-12-20T21:23:49.925000Z', 'url': 'https://swapi.dev/api/starships/43/'}
{'name': 'Rebel transport', 'model': 'GR-75 medium transport', 'manufacturer': 'Gallofree Yards, Inc.', 'cost_in_credits': 'unknown', 'length': '90', 'max_atmosphering_speed': '650', 'crew': '6', 'passengers': '90', 'cargo_capacity': '19000000', 'consumables': '6 months', 'hyperdrive_rating': '4.0', 'MGLT': '20', 'starship_class': 'Medium transport', 'pilots': [], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T12:34:52.264000Z', 'edited': '2014-12-20T21:23:49.895000Z', 'url': 'https://swapi.dev/api/starships/17/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Naboo Royal Starship', 'model': 'J-type 327 Nubian royal starship', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps, Nubia Star Drives', 'cost_in_credits': 'unknown', 'length': '76', 'max_atmosphering_speed': '920', 'crew': '8', 'passengers': 'unknown', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': '1.8', 'MGLT': 'unknown', 'starship_class': 'yacht', 'pilots': ['https://swapi.dev/api/people/39/'], 'films': ['https://swapi.dev/api/films/4/'], 'created': '2014-12-19T17:45:03.506000Z', 'edited': '2014-12-20T21:23:49.919000Z', 'url': 'https://swapi.dev/api/starships/40/'}
{'name': 'A-wing', 'model': 'RZ-1 A-wing Interceptor', 'manufacturer': 'Alliance Underground Engineering, Incom Corporation', 'cost_in_credits': '175000', 'length': '9.6', 'max_atmosphering_speed': '1300', 'crew': '1', 'passengers': '0', 'cargo_capacity': '40', 'consumables': '1 week', 'hyperdrive_rating': '1.0', 'MGLT': '120', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/29/'], 'films': ['https://swapi.dev/api/films/3/'], 'created': '2014-12-18T11:16:34.542000Z', 'edited': '2014-12-20T21:23:49.907000Z', 'url': 'https://swapi.dev/api/starships/28/'}
{'name': 'AA-9 Coruscant freighter', 'model': 'Botajef AA-9 Freighter-Liner', 'manufacturer': 'Botajef Shipyards', 'cost_in_credits': 'unknown', 'length': '390', 'max_atmosphering_speed': 'unknown', 'crew': 'unknown', 'passengers': '30000', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': 'unknown', 'MGLT': 'unknown', 'starship_class': 'freighter', 'pilots': [], 'films': ['https://swapi.dev/api/films/5/'], 'created': '2014-12-20T17:24:23.509000Z', 'edited': '2014-12-20T21:23:49.928000Z', 'url': 'https://swapi.dev/api/starships/47/'}
{'name': 'TIE Advanced x1', 'model': 'Twin Ion Engine Advanced x1', 'manufacturer': 'Sienar Fleet Systems', 'cost_in_credits': 'unknown', 'length': '9.2', 'max_atmosphering_speed': '1200', 'crew': '1', 'passengers': '0', 'cargo_capacity': '150', 'consumables': '5 days', 'hyperdrive_rating': '1.0', 'MGLT': '105', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/4/'], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-12T11:21:32.991000Z', 'edited': '2014-12-20T21:23:49.889000Z', 'url': 'https://swapi.dev/api/starships/13/'}
{'name': 'Scimitar', 'model': 'Star Courier', 'manufacturer': 'Republic Sienar Systems', 'cost_in_credits': '55000000', 'length': '26.5', 'max_atmosphering_speed': '1180', 'crew': '1', 'passengers': '6', 'cargo_capacity': '2500000', 'consumables': '30 days', 'hyperdrive_rating': '1.5', 'MGLT': 'unknown', 'starship_class': 'Space Transport', 'pilots': ['https://swapi.dev/api/people/44/'], 'films': ['https://swapi.dev/api/films/4/'], 'created': '2014-12-20T09:39:56.116000Z', 'edited': '2014-12-20T21:23:49.922000Z', 'url': 'https://swapi.dev/api/starships/41/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Naboo fighter', 'model': 'N-1 starfighter', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps', 'cost_in_credits': '200000', 'length': '11', 'max_atmosphering_speed': '1100', 'crew': '1', 'passengers': '0', 'cargo_capacity': '65', 'consumables': '7 days', 'hyperdrive_rating': '1.0', 'MGLT': 'unknown', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/11/', 'https://swapi.dev/api/people/35/', 'https://swapi.dev/api/people/60/'], 'films': ['https://swapi.dev/api/films/4/', 'https://swapi.dev/api/films/5/'], 'created': '2014-12-19T17:39:17.582000Z', 'edited': '2014-12-20T21:23:49.917000Z', 'url': 'https://swapi.dev/api/starships/39/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Republic Cruiser', 'model': 'Consular-class cruiser', 'manufacturer': 'Corellian Engineering Corporation', 'cost_in_credits': 'unknown', 'length': '115', 'max_atmosphering_speed': '900', 'crew': '9', 'passengers': '16', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': '2.0', 'MGLT': 'unknown', 'starship_class': 'Space cruiser', 'pilots': [], 'films': ['https://swapi.dev/api/films/4/'], 'created': '2014-12-19T17:01:31.488000Z', 'edited': '2014-12-20T21:23:49.912000Z', 'url': 'https://swapi.dev/api/starships/31/'}
{'name': 'H-type Nubian yacht', 'model': 'H-type Nubian yacht', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps', 'cost_in_credits': 'unknown', 'length': '47.9', 'max_atmosphering_speed': '8000', 'crew': '4', 'passengers': 'unknown', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': '0.9', 'MGLT': 'unknown', 'starship_class': 'yacht', 'pilots': ['https://swapi.dev/api/people/35/'], 'films': ['https://swapi.dev/api/films/5/'], 'created': '2014-12-20T17:46:46.847000Z', 'edited': '2014-12-20T21:23:49.932000Z', 'url': 'https://swapi.dev/api/starships/49/'}
{'name': 'X-wing', 'model': 'T-65 X-wing', 'manufacturer': 'Incom Corporation', 'cost_in_credits': '149999', 'length': '12.5', 'max_atmosphering_speed': '1050', 'crew': '1', 'passengers': '0', 'cargo_capacity': '110', 'consumables': '1 week', 'hyperdrive_rating': '1.0', 'MGLT': '100', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/1/', 'https://swapi.dev/api/people/9/', 'https://swapi.dev/api/people/18/', 'https://swapi.dev/api/people/19/'], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-12T11:19:05.340000Z', 'edited': '2014-12-20T21:23:49.886000Z', 'url': 'https://swapi.dev/api/starships/12/'}
{'name': 'Sentinel-class landing craft', 'model': 'Sentinel-class landing craft', 'manufacturer': 'Sienar Fleet Systems, Cyngus Spaceworks', 'cost_in_credits': '240000', 'length': '38', 'max_atmosphering_speed': '1000', 'crew': '5', 'passengers': '75', 'cargo_capacity': '180000', 'consumables': '1 month', 'hyperdrive_rating': '1.0', 'MGLT': '70', 'starship_class': 'landing craft', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T15:48:00.586000Z', 'edited': '2014-12-20T21:23:49.873000Z', 'url': 'https://swapi.dev/api/starships/5/'}
{'name': 'B-wing', 'model': 'A/SF-01 B-wing starfighter', 'manufacturer': 'Slayn & Korpil', 'cost_in_credits': '220000', 'length': '16.9', 'max_atmosphering_speed': '950', 'crew': '1', 'passengers': '0', 'cargo_capacity': '45', 'consumables': '1 week', 'hyperdrive_rating': '2.0', 'MGLT': '91', 'starship_class': 'Assault Starfighter', 'pilots': [], 'films': ['https://swapi.dev/api/films/3/'], 'created': '2014-12-18T11:18:04.763000Z', 'edited': '2014-12-20T21:23:49.909000Z', 'url': 'https://swapi.dev/api/starships/29/'}
{'detail': 'Not found'}
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}
{'name': 'Executor', 'model': 'Executor-class star dreadnought', 'manufacturer': 'Kuat Drive Yards, Fondor Shipyards', 'cost_in_credits': '1143350000', 'length': '19000', 'max_atmosphering_speed': 'n/a', 'crew': '279,144', 'passengers': '38000', 'cargo_capacity': '250000000', 'consumables': '6 years', 'hyperdrive_rating': '2.0', 'MGLT': '40', 'starship_class': 'Star dreadnought', 'pilots': [], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T12:31:42.547000Z', 'edited': '2014-12-20T21:23:49.893000Z', 'url': 'https://swapi.dev/api/starships/15/'}
{'name': 'EF76 Nebulon-B escort frigate', 'model': 'EF76 Nebulon-B escort frigate', 'manufacturer': 'Kuat Drive Yards', 'cost_in_credits': '8500000', 'length': '300', 'max_atmosphering_speed': '800', 'crew': '854', 'passengers': '75', 'cargo_capacity': '6000000', 'consumables': '2 years', 'hyperdrive_rating': '2.0', 'MGLT': '40', 'starship_class': 'Escort ship', 'pilots': [], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T13:06:30.813000Z', 'edited': '2014-12-20T21:23:49.902000Z', 'url': 'https://swapi.dev/api/starships/23/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Calamari Cruiser', 'model': 'MC80 Liberty type Star Cruiser', 'manufacturer': 'Mon Calamari shipyards', 'cost_in_credits': '104000000', 'length': '1200', 'max_atmosphering_speed': 'n/a', 'crew': '5400', 'passengers': '1200', 'cargo_capacity': 'unknown', 'consumables': '2 years', 'hyperdrive_rating': '1.0', 'MGLT': '60', 'starship_class': 'Star Cruiser', 'pilots': [], 'films': ['https://swapi.dev/api/films/3/'], 'created': '2014-12-18T10:54:57.804000Z', 'edited': '2014-12-20T21:23:49.904000Z', 'url': 'https://swapi.dev/api/starships/27/'}
{'name': 'Jedi starfighter', 'model': 'Delta-7 Aethersprite-class interceptor', 'manufacturer': 'Kuat Systems Engineering', 'cost_in_credits': '180000', 'length': '8', 'max_atmosphering_speed': '1150', 'crew': '1', 'passengers': '0', 'cargo_capacity': '60', 'consumables': '7 days', 'hyperdrive_rating': '1.0', 'MGLT': 'unknown', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/10/', 'https://swapi.dev/api/people/58/'], 'films': ['https://swapi.dev/api/films/5/', 'https://swapi.dev/api/films/6/'], 'created': '2014-12-20T17:35:23.906000Z', 'edited': '2014-12-20T21:23:49.930000Z', 'url': 'https://swapi.dev/api/starships/48/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Slave 1', 'model': 'Firespray-31-class patrol and attack', 'manufacturer': 'Kuat Systems Engineering', 'cost_in_credits': 'unknown', 'length': '21.5', 'max_atmosphering_speed': '1000', 'crew': '1', 'passengers': '6', 'cargo_capacity': '70000', 'consumables': '1 month', 'hyperdrive_rating': '3.0', 'MGLT': '70', 'starship_class': 'Patrol craft', 'pilots': ['https://swapi.dev/api/people/22/'], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/5/'], 'created': '2014-12-15T13:00:56.332000Z', 'edited': '2014-12-20T21:23:49.897000Z', 'url': 'https://swapi.dev/api/starships/21/'}
{'name': 'Imperial shuttle', 'model': 'Lambda-class T-4a shuttle', 'manufacturer': 'Sienar Fleet Systems', 'cost_in_credits': '240000', 'length': '20', 'max_atmosphering_speed': '850', 'crew': '6', 'passengers': '20', 'cargo_capacity': '80000', 'consumables': '2 months', 'hyperdrive_rating': '1.0', 'MGLT': '50', 'starship_class': 'Armed government transport', 'pilots': ['https://swapi.dev/api/people/1/', 'https://swapi.dev/api/people/13/', 'https://swapi.dev/api/people/14/'], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T13:04:47.235000Z', 'edited': '2014-12-20T21:23:49.900000Z', 'url': 'https://swapi.dev/api/starships/22/'}
{'name': 'Droid control ship', 'model': 'Lucrehulk-class Droid Control Ship', 'manufacturer': 'Hoersch-Kessel Drive, Inc.', 'cost_in_credits': 'unknown', 'length': '3170', 'max_atmosphering_speed': 'n/a', 'crew': '175', 'passengers': '139000', 'cargo_capacity': '4000000000', 'consumables': '500 days', 'hyperdrive_rating': '2.0', 'MGLT': 'unknown', 'starship_class': 'Droid control ship', 'pilots': [], 'films': ['https://swapi.dev/api/films/4/', 'https://swapi.dev/api/films/5/', 'https://swapi.dev/api/films/6/'], 'created': '2014-12-19T17:04:06.323000Z', 'edited': '2014-12-20T21:23:49.915000Z', 'url': 'https://swapi.dev/api/starships/32/'}
{'name': 'Millennium Falcon', 'model': 'YT-1300 light freighter', 'manufacturer': 'Corellian Engineering Corporation', 'cost_in_credits': '100000', 'length': '34.37', 'max_atmosphering_speed': '1050', 'crew': '4', 'passengers': '6', 'cargo_capacity': '100000', 'consumables': '2 months', 'hyperdrive_rating': '0.5', 'MGLT': '75', 'starship_class': 'Light freighter', 'pilots': ['https://swapi.dev/api/people/13/', 'https://swapi.dev/api/people/14/', 'https://swapi.dev/api/people/25/', 'https://swapi.dev/api/people/31/'], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-10T16:59:45.094000Z', 'edited': '2014-12-20T21:23:49.880000Z', 'url': 'https://swapi.dev/api/starships/10/'}

real	0m12,449s
user	0m0,527s
sys	0m0,060s
Вложения
aiohttp.post.py
(512 байт) 8 скачиваний
aiohttp.get.py
(288 байт) 8 скачиваний
aiohttp.group.py
(430 байт) 8 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 19:50

Olej писал(а):
23 дек 2023, 16:44
4. GRequests
GRequests представляет Gevent — «сетевую библиотеку Python на основе сопрограмм» — в Requests, позволяющую выполнять запросы асинхронно. Это старая библиотека, впервые выпущенная в 2012 году, которая не использует стандартный модуль Python asyncio. Отдельные запросы могут быть сделаны так же, как и в случае с запросами, но мы также можем использовать модуль Gevent для выполнения нескольких запросов...

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 GRequests.get.py 
Traceback (most recent call last):
  File "/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP/GRequests.get.py", line 1, in <module>
    import grequests
ModuleNotFoundError: No module named 'grequests'
Здесь, ожидаемо, всё та же история...
Но и с той же лёгкостью исправляемая:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ pip install grequests
Defaulting to user installation because normal site-packages is not writeable
Collecting grequests
  Downloading grequests-0.7.0-py2.py3-none-any.whl (5.7 kB)
Requirement already satisfied: requests in /home/olej/.local/lib/python3.10/site-packages (from grequests) (2.28.2)
Collecting gevent
  Downloading gevent-23.9.1-cp310-cp310-manylinux_2_28_x86_64.whl (6.4 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.4/6.4 MB 1.2 MB/s eta 0:00:00
Collecting zope.interface
  Downloading zope.interface-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (247 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 247.1/247.1 KB 608.0 kB/s eta 0:00:00
Collecting zope.event
  Downloading zope.event-5.0-py3-none-any.whl (6.8 kB)
Collecting greenlet>=2.0.0
  Downloading greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (616 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 616.0/616.0 KB 503.6 kB/s eta 0:00:00
Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests->grequests) (3.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib/python3/dist-packages (from requests->grequests) (1.26.5)
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests->grequests) (2020.6.20)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/olej/.local/lib/python3.10/site-packages (from requests->grequests) (3.0.1)
Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from zope.event->gevent->grequests) (59.6.0)
Installing collected packages: zope.interface, zope.event, greenlet, gevent, grequests
Successfully installed gevent-23.9.1 greenlet-3.0.3 grequests-0.7.0 zope.event-5.0 zope.interface-6.1
Здесь в коде указан групповой запрос:

Код: Выделить всё

for ship_id in range(0, 50):
    reqs.append(grequests.get(f'https://swapi.dev/api/starships/{ship_id}/'))
... иначе и смысл сопрограмм теряется.
Поэтому и а). выполнение его (на удалённом ресурсе) будет длинное и б). вывод будет огромный:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 GRequests.get.py 
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'CR90 corvette', 'model': 'CR90 corvette', 'manufacturer': 'Corellian Engineering Corporation', 'cost_in_credits': '3500000', 'length': '150', 'max_atmosphering_speed': '950', 'crew': '30-165', 'passengers': '600', 'cargo_capacity': '3000000', 'consumables': '1 year', 'hyperdrive_rating': '2.0', 'MGLT': '60', 'starship_class': 'corvette', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/3/', 'https://swapi.dev/api/films/6/'], 'created': '2014-12-10T14:20:33.369000Z', 'edited': '2014-12-20T21:23:49.867000Z', 'url': 'https://swapi.dev/api/starships/2/'}
{'name': 'Star Destroyer', 'model': 'Imperial I-class Star Destroyer', 'manufacturer': 'Kuat Drive Yards', 'cost_in_credits': '150000000', 'length': '1,600', 'max_atmosphering_speed': '975', 'crew': '47,060', 'passengers': 'n/a', 'cargo_capacity': '36000000', 'consumables': '2 years', 'hyperdrive_rating': '2.0', 'MGLT': '60', 'starship_class': 'Star Destroyer', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-10T15:08:19.848000Z', 'edited': '2014-12-20T21:23:49.870000Z', 'url': 'https://swapi.dev/api/starships/3/'}
{'detail': 'Not found'}
{'name': 'Sentinel-class landing craft', 'model': 'Sentinel-class landing craft', 'manufacturer': 'Sienar Fleet Systems, Cyngus Spaceworks', 'cost_in_credits': '240000', 'length': '38', 'max_atmosphering_speed': '1000', 'crew': '5', 'passengers': '75', 'cargo_capacity': '180000', 'consumables': '1 month', 'hyperdrive_rating': '1.0', 'MGLT': '70', 'starship_class': 'landing craft', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T15:48:00.586000Z', 'edited': '2014-12-20T21:23:49.873000Z', 'url': 'https://swapi.dev/api/starships/5/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}
{'name': 'Millennium Falcon', 'model': 'YT-1300 light freighter', 'manufacturer': 'Corellian Engineering Corporation', 'cost_in_credits': '100000', 'length': '34.37', 'max_atmosphering_speed': '1050', 'crew': '4', 'passengers': '6', 'cargo_capacity': '100000', 'consumables': '2 months', 'hyperdrive_rating': '0.5', 'MGLT': '75', 'starship_class': 'Light freighter', 'pilots': ['https://swapi.dev/api/people/13/', 'https://swapi.dev/api/people/14/', 'https://swapi.dev/api/people/25/', 'https://swapi.dev/api/people/31/'], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-10T16:59:45.094000Z', 'edited': '2014-12-20T21:23:49.880000Z', 'url': 'https://swapi.dev/api/starships/10/'}
{'name': 'Y-wing', 'model': 'BTL Y-wing', 'manufacturer': 'Koensayr Manufacturing', 'cost_in_credits': '134999', 'length': '14', 'max_atmosphering_speed': '1000km', 'crew': '2', 'passengers': '0', 'cargo_capacity': '110', 'consumables': '1 week', 'hyperdrive_rating': '1.0', 'MGLT': '80', 'starship_class': 'assault starfighter', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-12T11:00:39.817000Z', 'edited': '2014-12-20T21:23:49.883000Z', 'url': 'https://swapi.dev/api/starships/11/'}
{'name': 'X-wing', 'model': 'T-65 X-wing', 'manufacturer': 'Incom Corporation', 'cost_in_credits': '149999', 'length': '12.5', 'max_atmosphering_speed': '1050', 'crew': '1', 'passengers': '0', 'cargo_capacity': '110', 'consumables': '1 week', 'hyperdrive_rating': '1.0', 'MGLT': '100', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/1/', 'https://swapi.dev/api/people/9/', 'https://swapi.dev/api/people/18/', 'https://swapi.dev/api/people/19/'], 'films': ['https://swapi.dev/api/films/1/', 'https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-12T11:19:05.340000Z', 'edited': '2014-12-20T21:23:49.886000Z', 'url': 'https://swapi.dev/api/starships/12/'}
{'name': 'TIE Advanced x1', 'model': 'Twin Ion Engine Advanced x1', 'manufacturer': 'Sienar Fleet Systems', 'cost_in_credits': 'unknown', 'length': '9.2', 'max_atmosphering_speed': '1200', 'crew': '1', 'passengers': '0', 'cargo_capacity': '150', 'consumables': '5 days', 'hyperdrive_rating': '1.0', 'MGLT': '105', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/4/'], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-12T11:21:32.991000Z', 'edited': '2014-12-20T21:23:49.889000Z', 'url': 'https://swapi.dev/api/starships/13/'}
{'detail': 'Not found'}
{'name': 'Executor', 'model': 'Executor-class star dreadnought', 'manufacturer': 'Kuat Drive Yards, Fondor Shipyards', 'cost_in_credits': '1143350000', 'length': '19000', 'max_atmosphering_speed': 'n/a', 'crew': '279,144', 'passengers': '38000', 'cargo_capacity': '250000000', 'consumables': '6 years', 'hyperdrive_rating': '2.0', 'MGLT': '40', 'starship_class': 'Star dreadnought', 'pilots': [], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T12:31:42.547000Z', 'edited': '2014-12-20T21:23:49.893000Z', 'url': 'https://swapi.dev/api/starships/15/'}
{'detail': 'Not found'}
{'name': 'Rebel transport', 'model': 'GR-75 medium transport', 'manufacturer': 'Gallofree Yards, Inc.', 'cost_in_credits': 'unknown', 'length': '90', 'max_atmosphering_speed': '650', 'crew': '6', 'passengers': '90', 'cargo_capacity': '19000000', 'consumables': '6 months', 'hyperdrive_rating': '4.0', 'MGLT': '20', 'starship_class': 'Medium transport', 'pilots': [], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T12:34:52.264000Z', 'edited': '2014-12-20T21:23:49.895000Z', 'url': 'https://swapi.dev/api/starships/17/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Slave 1', 'model': 'Firespray-31-class patrol and attack', 'manufacturer': 'Kuat Systems Engineering', 'cost_in_credits': 'unknown', 'length': '21.5', 'max_atmosphering_speed': '1000', 'crew': '1', 'passengers': '6', 'cargo_capacity': '70000', 'consumables': '1 month', 'hyperdrive_rating': '3.0', 'MGLT': '70', 'starship_class': 'Patrol craft', 'pilots': ['https://swapi.dev/api/people/22/'], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/5/'], 'created': '2014-12-15T13:00:56.332000Z', 'edited': '2014-12-20T21:23:49.897000Z', 'url': 'https://swapi.dev/api/starships/21/'}
{'name': 'Imperial shuttle', 'model': 'Lambda-class T-4a shuttle', 'manufacturer': 'Sienar Fleet Systems', 'cost_in_credits': '240000', 'length': '20', 'max_atmosphering_speed': '850', 'crew': '6', 'passengers': '20', 'cargo_capacity': '80000', 'consumables': '2 months', 'hyperdrive_rating': '1.0', 'MGLT': '50', 'starship_class': 'Armed government transport', 'pilots': ['https://swapi.dev/api/people/1/', 'https://swapi.dev/api/people/13/', 'https://swapi.dev/api/people/14/'], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T13:04:47.235000Z', 'edited': '2014-12-20T21:23:49.900000Z', 'url': 'https://swapi.dev/api/starships/22/'}
{'name': 'EF76 Nebulon-B escort frigate', 'model': 'EF76 Nebulon-B escort frigate', 'manufacturer': 'Kuat Drive Yards', 'cost_in_credits': '8500000', 'length': '300', 'max_atmosphering_speed': '800', 'crew': '854', 'passengers': '75', 'cargo_capacity': '6000000', 'consumables': '2 years', 'hyperdrive_rating': '2.0', 'MGLT': '40', 'starship_class': 'Escort ship', 'pilots': [], 'films': ['https://swapi.dev/api/films/2/', 'https://swapi.dev/api/films/3/'], 'created': '2014-12-15T13:06:30.813000Z', 'edited': '2014-12-20T21:23:49.902000Z', 'url': 'https://swapi.dev/api/starships/23/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Calamari Cruiser', 'model': 'MC80 Liberty type Star Cruiser', 'manufacturer': 'Mon Calamari shipyards', 'cost_in_credits': '104000000', 'length': '1200', 'max_atmosphering_speed': 'n/a', 'crew': '5400', 'passengers': '1200', 'cargo_capacity': 'unknown', 'consumables': '2 years', 'hyperdrive_rating': '1.0', 'MGLT': '60', 'starship_class': 'Star Cruiser', 'pilots': [], 'films': ['https://swapi.dev/api/films/3/'], 'created': '2014-12-18T10:54:57.804000Z', 'edited': '2014-12-20T21:23:49.904000Z', 'url': 'https://swapi.dev/api/starships/27/'}
{'name': 'A-wing', 'model': 'RZ-1 A-wing Interceptor', 'manufacturer': 'Alliance Underground Engineering, Incom Corporation', 'cost_in_credits': '175000', 'length': '9.6', 'max_atmosphering_speed': '1300', 'crew': '1', 'passengers': '0', 'cargo_capacity': '40', 'consumables': '1 week', 'hyperdrive_rating': '1.0', 'MGLT': '120', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/29/'], 'films': ['https://swapi.dev/api/films/3/'], 'created': '2014-12-18T11:16:34.542000Z', 'edited': '2014-12-20T21:23:49.907000Z', 'url': 'https://swapi.dev/api/starships/28/'}
{'name': 'B-wing', 'model': 'A/SF-01 B-wing starfighter', 'manufacturer': 'Slayn & Korpil', 'cost_in_credits': '220000', 'length': '16.9', 'max_atmosphering_speed': '950', 'crew': '1', 'passengers': '0', 'cargo_capacity': '45', 'consumables': '1 week', 'hyperdrive_rating': '2.0', 'MGLT': '91', 'starship_class': 'Assault Starfighter', 'pilots': [], 'films': ['https://swapi.dev/api/films/3/'], 'created': '2014-12-18T11:18:04.763000Z', 'edited': '2014-12-20T21:23:49.909000Z', 'url': 'https://swapi.dev/api/starships/29/'}
{'detail': 'Not found'}
{'name': 'Republic Cruiser', 'model': 'Consular-class cruiser', 'manufacturer': 'Corellian Engineering Corporation', 'cost_in_credits': 'unknown', 'length': '115', 'max_atmosphering_speed': '900', 'crew': '9', 'passengers': '16', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': '2.0', 'MGLT': 'unknown', 'starship_class': 'Space cruiser', 'pilots': [], 'films': ['https://swapi.dev/api/films/4/'], 'created': '2014-12-19T17:01:31.488000Z', 'edited': '2014-12-20T21:23:49.912000Z', 'url': 'https://swapi.dev/api/starships/31/'}
{'name': 'Droid control ship', 'model': 'Lucrehulk-class Droid Control Ship', 'manufacturer': 'Hoersch-Kessel Drive, Inc.', 'cost_in_credits': 'unknown', 'length': '3170', 'max_atmosphering_speed': 'n/a', 'crew': '175', 'passengers': '139000', 'cargo_capacity': '4000000000', 'consumables': '500 days', 'hyperdrive_rating': '2.0', 'MGLT': 'unknown', 'starship_class': 'Droid control ship', 'pilots': [], 'films': ['https://swapi.dev/api/films/4/', 'https://swapi.dev/api/films/5/', 'https://swapi.dev/api/films/6/'], 'created': '2014-12-19T17:04:06.323000Z', 'edited': '2014-12-20T21:23:49.915000Z', 'url': 'https://swapi.dev/api/starships/32/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'Naboo fighter', 'model': 'N-1 starfighter', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps', 'cost_in_credits': '200000', 'length': '11', 'max_atmosphering_speed': '1100', 'crew': '1', 'passengers': '0', 'cargo_capacity': '65', 'consumables': '7 days', 'hyperdrive_rating': '1.0', 'MGLT': 'unknown', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/11/', 'https://swapi.dev/api/people/35/', 'https://swapi.dev/api/people/60/'], 'films': ['https://swapi.dev/api/films/4/', 'https://swapi.dev/api/films/5/'], 'created': '2014-12-19T17:39:17.582000Z', 'edited': '2014-12-20T21:23:49.917000Z', 'url': 'https://swapi.dev/api/starships/39/'}
{'name': 'Naboo Royal Starship', 'model': 'J-type 327 Nubian royal starship', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps, Nubia Star Drives', 'cost_in_credits': 'unknown', 'length': '76', 'max_atmosphering_speed': '920', 'crew': '8', 'passengers': 'unknown', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': '1.8', 'MGLT': 'unknown', 'starship_class': 'yacht', 'pilots': ['https://swapi.dev/api/people/39/'], 'films': ['https://swapi.dev/api/films/4/'], 'created': '2014-12-19T17:45:03.506000Z', 'edited': '2014-12-20T21:23:49.919000Z', 'url': 'https://swapi.dev/api/starships/40/'}
{'name': 'Scimitar', 'model': 'Star Courier', 'manufacturer': 'Republic Sienar Systems', 'cost_in_credits': '55000000', 'length': '26.5', 'max_atmosphering_speed': '1180', 'crew': '1', 'passengers': '6', 'cargo_capacity': '2500000', 'consumables': '30 days', 'hyperdrive_rating': '1.5', 'MGLT': 'unknown', 'starship_class': 'Space Transport', 'pilots': ['https://swapi.dev/api/people/44/'], 'films': ['https://swapi.dev/api/films/4/'], 'created': '2014-12-20T09:39:56.116000Z', 'edited': '2014-12-20T21:23:49.922000Z', 'url': 'https://swapi.dev/api/starships/41/'}
{'detail': 'Not found'}
{'name': 'J-type diplomatic barge', 'model': 'J-type diplomatic barge', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps, Nubia Star Drives', 'cost_in_credits': '2000000', 'length': '39', 'max_atmosphering_speed': '2000', 'crew': '5', 'passengers': '10', 'cargo_capacity': 'unknown', 'consumables': '1 year', 'hyperdrive_rating': '0.7', 'MGLT': 'unknown', 'starship_class': 'Diplomatic barge', 'pilots': [], 'films': ['https://swapi.dev/api/films/5/'], 'created': '2014-12-20T11:05:51.237000Z', 'edited': '2014-12-20T21:23:49.925000Z', 'url': 'https://swapi.dev/api/starships/43/'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'detail': 'Not found'}
{'name': 'AA-9 Coruscant freighter', 'model': 'Botajef AA-9 Freighter-Liner', 'manufacturer': 'Botajef Shipyards', 'cost_in_credits': 'unknown', 'length': '390', 'max_atmosphering_speed': 'unknown', 'crew': 'unknown', 'passengers': '30000', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': 'unknown', 'MGLT': 'unknown', 'starship_class': 'freighter', 'pilots': [], 'films': ['https://swapi.dev/api/films/5/'], 'created': '2014-12-20T17:24:23.509000Z', 'edited': '2014-12-20T21:23:49.928000Z', 'url': 'https://swapi.dev/api/starships/47/'}
{'name': 'Jedi starfighter', 'model': 'Delta-7 Aethersprite-class interceptor', 'manufacturer': 'Kuat Systems Engineering', 'cost_in_credits': '180000', 'length': '8', 'max_atmosphering_speed': '1150', 'crew': '1', 'passengers': '0', 'cargo_capacity': '60', 'consumables': '7 days', 'hyperdrive_rating': '1.0', 'MGLT': 'unknown', 'starship_class': 'Starfighter', 'pilots': ['https://swapi.dev/api/people/10/', 'https://swapi.dev/api/people/58/'], 'films': ['https://swapi.dev/api/films/5/', 'https://swapi.dev/api/films/6/'], 'created': '2014-12-20T17:35:23.906000Z', 'edited': '2014-12-20T21:23:49.930000Z', 'url': 'https://swapi.dev/api/starships/48/'}
{'name': 'H-type Nubian yacht', 'model': 'H-type Nubian yacht', 'manufacturer': 'Theed Palace Space Vessel Engineering Corps', 'cost_in_credits': 'unknown', 'length': '47.9', 'max_atmosphering_speed': '8000', 'crew': '4', 'passengers': 'unknown', 'cargo_capacity': 'unknown', 'consumables': 'unknown', 'hyperdrive_rating': '0.9', 'MGLT': 'unknown', 'starship_class': 'yacht', 'pilots': ['https://swapi.dev/api/people/35/'], 'films': ['https://swapi.dev/api/films/5/'], 'created': '2014-12-20T17:46:46.847000Z', 'edited': '2014-12-20T21:23:49.932000Z', 'url': 'https://swapi.dev/api/starships/49/'}
Вложения
GRequests.get.py
(222 байт) 8 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 19:55

Olej писал(а):
23 дек 2023, 16:44
5. HTTPX
HTTPX предлагает «API широко совместимый с пакетом Requests », это единственная библиотека в нашем списке, предлагающая поддержку HTTP 2.0, а также асинхронные API.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 HTTPX.get.py 
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 HTTPX.post.py 
{'args': {}, 'data': '{"name": "Obi-Wan Kenobi", "height": "182", "mass": "77", "hair_color": "auburn, white", "skin_color": "fair", "eye_color": "blue-gray", "birth_year": "57BBY", "gender": "male"}', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Content-Length': '177', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-httpx/0.23.3', 'X-Amzn-Trace-Id': 'Root=1-658710a5-47ba10165fe9d72b14a045e1'}, 'json': {'birth_year': '57BBY', 'eye_color': 'blue-gray', 'gender': 'male', 'hair_color': 'auburn, white', 'height': '182', 'mass': '77', 'name': 'Obi-Wan Kenobi', 'skin_color': 'fair'}, 'origin': '45.9.31.32', 'url': 'https://httpbin.org/post'}
Вложения
HTTPX.async.py
(227 байт) 8 скачиваний
HTTPX.post.py
(305 байт) 8 скачиваний
HTTPX.get.py
(84 байт) 8 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: сетевые приложения

Непрочитанное сообщение Olej » 23 дек 2023, 20:23

Olej писал(а):
23 дек 2023, 16:44
6. Uplink
Uplink — самая последняя библиотека в нашем списке, и она использует несколько иной подход, чем другие наши библиотеки, поскольку она в первую очередь фокусируется не на произвольных HTTP-запросах, а скорее на типичных потоках запросов со структурой REST, с шаблонами путей (маршрутами) и REST параметрами.

По умолчанию Uplink использует нашу знаменитую библиотеку Requests для сборки реального HTTP-запроса, однако он также поддерживает aiohttp и Twisted, если вы предпочитаете асинхронные вызовы запросов. В этом смысле это не столько полноценный HTTP-клиент, сколько удобная оболочка существующих HTTP-клиентов.

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 uplink.get.py 
Traceback (most recent call last):
  File "/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP/uplink.get.py", line 1, in <module>
    from uplink import Consumer, get
ModuleNotFoundError: No module named 'uplink'

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ pip install uplink
Defaulting to user installation because normal site-packages is not writeable
Collecting uplink
  Downloading uplink-0.9.7-py2.py3-none-any.whl (69 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 69.5/69.5 KB 290.2 kB/s eta 0:00:00
Requirement already satisfied: six>=1.13.0 in /usr/lib/python3/dist-packages (from uplink) (1.16.0)
Collecting uritemplate>=3.0.0
  Downloading uritemplate-4.1.1-py2.py3-none-any.whl (10 kB)
Requirement already satisfied: requests>=2.18.0 in /home/olej/.local/lib/python3.10/site-packages (from uplink) (2.28.2)
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests>=2.18.0->uplink) (2020.6.20)
Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests>=2.18.0->uplink) (3.3)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/olej/.local/lib/python3.10/site-packages (from requests>=2.18.0->uplink) (3.0.1)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib/python3/dist-packages (from requests>=2.18.0->uplink) (1.26.5)
Installing collected packages: uritemplate, uplink
Successfully installed uplink-0.9.7 uritemplate-4.1.1

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 uplink.get.py 
{'name': 'Death Star', 'model': 'DS-1 Orbital Battle Station', 'manufacturer': 'Imperial Department of Military Research, Sienar Fleet Systems', 'cost_in_credits': '1000000000000', 'length': '120000', 'max_atmosphering_speed': 'n/a', 'crew': '342,953', 'passengers': '843,342', 'cargo_capacity': '1000000000000', 'consumables': '3 years', 'hyperdrive_rating': '4.0', 'MGLT': '10', 'starship_class': 'Deep Space Mobile Battlestation', 'pilots': [], 'films': ['https://swapi.dev/api/films/1/'], 'created': '2014-12-10T16:36:50.509000Z', 'edited': '2014-12-20T21:26:24.783000Z', 'url': 'https://swapi.dev/api/starships/9/'}

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Python/HTTP$ python3 uplink.post.py 
{'args': {}, 'data': '{"name": "Obi-Wan Kenobi", "height": "182", "mass": "77", "hair_color": "auburn, white", "skin_color": "fair", "eye_color": "blue-gray", "birth_year": "57BBY", "gender": "male"}', 'files': {}, 'form': {}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '177', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.10', 'X-Amzn-Trace-Id': 'Root=1-6587170e-6ae7f8181e0e4435401a26d8'}, 'json': {'birth_year': '57BBY', 'eye_color': 'blue-gray', 'gender': 'male', 'hair_color': 'auburn, white', 'height': '182', 'mass': '77', 'name': 'Obi-Wan Kenobi', 'skin_color': 'fair'}, 'origin': '45.9.31.32', 'url': 'https://httpbin.org/post'}
Вложения
uplink.get.py
(288 байт) 8 скачиваний
uplink.post.py
(527 байт) 8 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей