HTTPX: Python HTTP의 미래 구축 지원

인코딩 / httpx


Python의 차세대 HTTP 클라이언트입니다.🦋



HTTPX-Python의 차세대 HTTP 클라이언트입니다.


HTTPX는 Python 3의 기능을 모두 갖춘 HTTP 클라이언트로 동기식 및 비동기식 API를 제공하고 HTTP/1.1 및 HTTP/2를 지원합니다.
참고: 테스트 버전에서는 HTTPX를 고려해야 합니다.우리는 우리가 이미 공공 API가 왔다고 믿는다
현재는 안정점이지만 의존항을 0.16.* 로 고정하는 것을 강력히 권장합니다
정확하게 복습할 수 있도록 발표API changes between package updates.1.0 버전은 2021에 출시될 예정이다.
우리 시작합시다...
>>> import httpx
>>> r = httpx.get('https://www.example.org/')
>>> r
<Response [200 OK]&gt
>>> r.status_code
200
>>> r.headers['content-type']
'text/html; charset=UTF-8'
>>> r.text
'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...'

Or, using the async API...

Use IPython or Python 3.8+ with python -m asyncio to try this code interactively.

>>> import httpx
>>> async with httpx.AsyncClient() as client
...

HTTPX 🦋 is a next generation HTTP client for Python. It is Requests-compatible, supports HTTP/2 and HTTP/1.1, has async support, and an ever-expanding community of 35+ awesome contributors. ❤

HTTPX is part of a growing ecosystem of async-capable Python projects lead by the Encode organization (which backs the Django REST Framework). Some of the most notable projects include Uvicorn, Starlette, and Databases.

Hacktoberfest started yesterday, and on behalf of the HTTPX maintenance team I can say we're very excited to be part of it this year!

Before getting to the contributing guide, a short preview of what HTTPX can do…

Your first request to dev.to using HTTPX:

>>> import httpx
>>> r = httpx.get('https://dev.to')
>>> r.status_code
200
>>> r.headers['content-type']
'text/html; charset=utf-8'
>>> r.text[:50]
'<!DOCTYPE html>\n<html lang="en">\n  <head>\n    <met'
>>> r.http_version
'HTTP/1.1'
개발자는 HTTP/2를 지원합니까?
>>> import httpx
>>> # The top-level API only supports HTTP/1.1 for efficiency reasons,
>>> # but 'Client' uses HTTP/2 by default.
>>> with httpx.Client() as client:
...    r = client.get('https://dev.to')
...
>>> r.http_version
'HTTP/2'  # YAY! 🎉
HTTPX는 파이썬 네트워크 응용 프로그램(WSGI+ASGI)도 호출할 수 있습니다.플라스크 예시...
>>> from flask import Flask
>>> import httpx
>>> app = Flask(__name__)
>>> @app.route("/")
... def hello():
...     return "Hello, world"
...
>>> with httpx.Client(app=app, base_url='http://testserver') as client:
...     r = client.get('/')
...
>>> r.status_code
200
>>> r.text
'Hello, world'  # Tada! 🦋
>>>
지원 async/await!IPython REPL을 시작하여 다음을 시도해 보겠습니다.
In [1]: import httpx
In [2]: import asyncio
In [3]: # We're going to fetch tag pages concurrently...
In [4]: async def fetch(tag, client):
   ...:     return await client.get(f'https://dev.to/t/{tag}')
   ...:

In [5]: async with httpx.AsyncClient() as client:
   ...:     responses = await asyncio.gather(
   ...:         fetch('hacktoberfest', client),
   ...:         fetch('python', client),
   ...:         fetch('opensource' client),
   ...:     )

In [6]: responses
Out[6]: [<Response [200 OK]>, <Response [200 OK]>, <Response [200 OK]>]
In [7]: [r.url for r in responses]
Out[7]:
[URL('https://dev.to/t/hacktoberfest'),
 URL('https://dev.to/t/python'),
 URL('https://dev.to/t/opensource')]
(이 예에서 사용asyncio, 그러나 사용 trio is also supported!)
HTTPX는 이미 많은 기능을 내장하고 있지만, 그 중 일부 분야는 여전히 더 많은 작업을 필요로 하기 때문에 알파 단계에 있다.
이것은 우리가 파이썬 HTTP의 미래를 구축하는 데 도움을 줄 수 있는 충분한 소개이다.

너는 어떻게 도울 수 있느냐


해봐!


HTTPX의 발전을 지원하는 가장 직접적인 방법은 직접 시도하는 것입니다.
예:
  • 본문 소개의 예시 코드를 실행하고 HTTPX의 실제 응용을 보십시오!
  • HTTPX 호출public API을 사용하여 간단한 어플리케이션을 구축합니다.
  • HTTP 호출을 요청하는 애플리케이션을 HTTPX로 마이그레이션합니다.
  • HTTPX를 Flask, Starlette, FastAPI 등이 지원하는 웹 프로젝트의 테스트 클라이언트로 사용합니다. 자세한 내용은 Calling into Python web apps 을 참조하십시오.
  • HTTPX를 사용하여 웹 페이지를 병렬적으로 가져오는 네트워크 거미를 구축합니다.
  • ... 그리고 네가 해보고 싶은 어떤 생각도 있어!
  • 네가 HTTPX를 시도하기로 결정하든지 간에 우리는 기꺼이 듣겠다!환매, 블로그 게시물 또는 댓글로 공유하고 싶은 내용을 가리키는 링크를 보내세요.:-)

    공헌


    이 글을 쓸 때 놀라운 리스트10 hacktoberfest -labelled issues가 있습니다. 이 모든 것을 잡을 수 있습니다!기대 많이!
    다음은 현재 사용 가능한 몇 가지 하이라이트입니다.

    문서


    문서는 모든 소프트웨어 항목에 매우 중요하다.이 기능은 새로운 사용자가 특정 기능이나 API를 어떻게 사용하는지에 대한 정보를 찾을 수 있도록 도와줍니다.
    우리는 HTTPX documentation 몇 군데에서 개선이 필요하다는 것을 안다.타자, 복사, 정보 누락에 관계없이 개선할 수 있다고 생각하는 모든 내용을 마음대로 훑어보고 제출하십시오

    .post()。put (), 및.API 문서의 patch() 함수에 "files" 매개 변수가 없습니다. #409



    sethmlarson
    발표 날짜
    클라이언트 및 비동기식 클라이언트의 경우 API docs files, .post().patch() 에 대한 매개변수 부족 .put()View on GitHub

    환경 변수 문서는 모든 용례의 합리성을 증명해야 한다. #404



    tomchristie
    발표 날짜
    우리의 environment variable documentation 은 각 envvar에 대해 다음과 같은 작업 중 하나를 수행해야 하며, 각 사례에 몇 가지 이유나 배경을 포함해야 한다.
  • 환경 변수가 HTTPX에 특정한 것임을 명확히 합니다.HTTPX_ 접두사에 대해서만 관련될 수 있음
  • 환경 변수가 각종 도구에 의해 약정으로 사용되고 최소한 하나의 관련 하이퍼링크가 있음을 명확히 한다.
  • 예.SSLKEYLOGFILE 더 많은 상하문을 제공할 수 있습니다. "keylog 파일은 디버깅 목적으로만 사용됩니다."어떻게 사용하는지, 언제 사용하는지, 어떤 디버깅 도구와 함께 사용하는지 명확하게 설명하지 않았다.SSL_CERT_FILESSL_CERT_DIR에는 해당 문서에 대한 링크가 포함될 수 있습니다.그것들을 지원하는 다른 도구의 예를 들 수 있을까요?HTTP_PROXY,HTTPS_PROXY,ALL_PROXY는 약정된 문서를 가리키는 링크를 포함할 수 있습니다.그것들을 지원하는 다른 도구의 예를 들 수 있을까요?
    View on GitHub

    더 명확한 문서는 httpx를 설명했다.Client는 요청과 같습니다.''세션. #403



    innawe
    발표 날짜
    이것은 문제가 아니지만, httpx 문서를 읽고 해결 방안을 찾지 못했습니다.
    요청 중, 나는 s=요청을 사용한다.session (), 어떻게 httpx를 사용하여 같은 일을 합니까?
    s=httpx와 유사한 일을 할 수 있다.세션()?
    다시 한 번 고맙고 죄송합니다.
    View on GitHub

    오류 수정


    사실: 모든 소프트웨어에 버그가 있습니다.🐛, 물론 HTTPX도 예외는 아니다!
    일부 오류가 추적되었는데..

    호스트 헤더에userinfo 구성 요소가 포함되어 있습니다 #391



    sethmlarson
    발표 날짜 BaseRequest.prepare() 다음 URL을 지정하면 기본 Host 헤더가 [email protected]:123: http://[email protected]:123 로 잘못 설정됩니다.Host에 분배되기 전에userinfo 구성 요소를 권한에서 삭제해야 합니다.
    View on GitHub
    ...하지만 그 중 대다수는 발견, 추적, 복구가 필요하다!
    이것도 HTTPX를 시험해 보는 것이 매우 중요한 이유이다.당신의 용례는 우리가 고려한 용례가 아닐 수도 있고, 아직 고려하지 않은 상황에서일 수도 있습니다.
    만약 당신이 무슨 이상한 점을 발견한다면, open an issue, 우리는 함께 조사할 것입니다!

    새로운 기능


    HTTPX는 이미 많은 기능을 내장하고 있지만, 우리는 어떻게 더욱 추진할 것인가에 대해 이미 생각을 가지고 있다.
    다음은 당신이 해결할 수 있는 기능들입니다.만약 HTTPX를 사용해 보았지만 부족한 것이 있다면 open an issue!우리는 함께 토론할 것입니다. 만약 당신이 이 기능을 실현하고 싶다면, 우리는 기꺼이 당신이 시작하는 것을 도울 것입니다.

    NO_PROXY 환경 변수에 대한 지원 추가 #360



    sethmlarson
    발표 날짜 NO_PROXY 환경 변수 설명은 다음과 같습니다.
  • http://www.gnu.org/software/wget/manual/html_node/Proxies.html
  • https://github.com/psf/requests/blob/840540b6b1f07ef87faab73392c03fbef0dcc9fe/requests/utils.py#L395
  • 이 임무를 완수하기 위해서 우리는 다음과 같이 해야 한다.
  • NO_PROXY를 실행합니다. 호스트 목록입니다. 목록에서 찾으면 에이전트를 돌아갑니다.
  • trust_env=True 에서만 사용 가능
  • 새 환경 변수에 대한 문서 업데이트.
  • 모든 코드 지점의 테스트 용례.
  • View on GitHub

    [기능 요청]: buildin ConnectionResetError 및 ConnectionError 대신 httpx 이상을 발생시킵니다. #349



    Trim21
    발표 날짜
    이것은 오류 보고가 아니라 기능 요청입니다.
    나는 웹 서버에서 상류api를 요청하기 위해 requests 를 사용한다.따라서 나는 중간부품의 모든 requests.RequestException 를 처리하고 502 upstream 오류를 되돌릴 수 있다.
    그러나 내가 httpx로 옮긴 후에 httpx는 http(s) 요청을 할 때 이런 이상이 없었다. 이것은 httpx.ConnectTimeout,buildinConnectionErrorConnectResetError를 일으킬 것이다.마지막 두 가지 이상은 httpx 뿐만 아니라
    어쩌면httpx도 포장ConnectionError과 다른 구축 연결 이상을 해야 하는가?
    View on GitHub

    생각을 끝내다


    HTTPX에 기여할 수 있는 많은 방법이 있습니다. 모든 공헌을 환영합니다!질문, 문서 개선, 기능 요청, 버그 보고서를 선택하면 contributing guide부터 읽고 해킹할 수 있습니다!
    이 글을 읽어 주셔서 감사합니다. 우리는 당신의 놀라운 공헌을 기대하고 있습니다.💖🦋
    - HTTPX 유지 관리 팀

    좋은 웹페이지 즐겨찾기