mrkeyoor.com_
Sun 06 Sept 16:35 UTC
Dev Toolsevaluationupdated 06 Sept 2026

requests review

Requests is a synchronous Python library for making HTTP/1.1 calls without handling connection details by hand. It covers URL parameters, forms, JSON, authentication, sessions, cookies, proxies, TLS verification, uploads, and streamed downloads through a small API.

Verdict

Our Requests run installed 54 packages in 37 seconds, built in 6 seconds, and reported 619 passed, 0 failed, and 15 skipped of 619. Use it as the default choice for straightforward synchronous HTTP/1.1 in Python, especially when compatibility and a stable interface matter. Choose HTTPX or aiohttp for async work, and treat explicit timeouts plus normal TLS verification as required application policy.

We ran it

Lab card: what happened when we ran requestsScreenshot of requests (requests.readthedocs.io/en/latest)
Install✓ · 37s54 packages · 63 MB
Build✓ · 6s
Tests✓ · 85s619 passed · 0 failed · 15 skipped of 619 (pytest)
Known vulns0(pip-audit)
Repo128 files~12,069 lines of source · 4.5 MB · 8 CI workflows · tests dir

Answers from our run

Does requests build from source?

Dependencies installed in 37 seconds (54 packages), and the build succeeded in 6 seconds. We cloned commit dae7ef6 into a clean Debian container with 3 CPUs and no project-specific setup.

Do requests's tests pass?

Yes: 619 of 619 passed when we ran the project's own test command (pytest). Some failures need services or credentials a bare container does not have.

Does requests have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use requests?

Async applications or clients that require HTTP/2: the README promises HTTP/1.1 and Requests exposes a synchronous API.

What are the alternatives to requests?

HTTPX, aiohttp, urllib3. Our Requests run installed 54 packages in 37 seconds, built in 6 seconds, and reported 619 passed, 0 failed, and 15 skipped of 619.

Setup5/537-second install, 6-second build, and no service to configure
Docs5/5Clear quickstart plus detailed sessions, TLS, proxy, and stream guides
Community5/554,281 stars with a September push and active issue triage
Maturity5/5v2.34.2, broad compatibility, and a fully passing lab run

Who it’s for

Python scripts, command-line tools, workers, and web backends that make synchronous HTTP calls.
Developers who value a familiar API and wide compatibility over newer protocol features.
Applications that need sessions, cookies, authentication, proxies, uploads, or TLS controls without assembling lower-level pieces.
Libraries that want a conservative HTTP dependency with a large user base and current maintenance.

Who it’s NOT for

Async applications or clients that require HTTP/2: the README promises HTTP/1.1 and Requests exposes a synchronous API.
Projects still on Python 3.9 or older: current package metadata requires Python 3.10+.
Production code that cannot set an explicit timeout on every call: the quickstart says Requests does not time out when the parameter is omitted.
Uploaders that need streaming multipart bodies with no extra dependency: the docs direct large multipart uploads to requests-toolbelt.
Clients that require encrypted private keys for mutual TLS: the advanced guide says encrypted keys are unsupported.
Applications centered on non-Latin digest credentials or complex no_proxy overrides unless they can test those paths: open issues 6102 and 5000 document unresolved behavior.

Setup reality

Our sandbox installed 54 packages in 37 seconds and used 63 MB. The build succeeded in 6 seconds. Tests succeeded in 85 seconds; pytest reported 619 passed, 0 failed, and 15 skipped of 619. Pip-audit found 0 known vulnerabilities.

Normal use needs Python 3.10+ and no service, account, or Requests-specific credential. Applications supply their own endpoint credentials, proxies, client certificates, or CA bundle when needed. The package declares charset-normalizer, idna, urllib3, and certifi as runtime requirements, with SOCKS support available as an extra.

Requests is synchronous and targets HTTP/1.1. Production callers need explicit timeouts because the default can wait indefinitely. Streamed responses must be fully consumed or closed before their connections return to the pool, and TLS verification should remain enabled. The repository has no Dockerfile because it is a library, not a server.

Requests v2.34.2 keeps synchronous HTTP deliberately ordinary

Requests v2.34.2 makes the common HTTP operations look like regular Python calls. A developer passes query parameters, form data, JSON, headers, files, or authentication and receives a Response object with status, headers, text, bytes, and JSON helpers. Sessions persist cookies and shared settings while reusing connections through urllib3. The package handles HTTP/1.1, redirects, decompression, proxies, basic and digest authentication, netrc credentials, TLS verification, and streamed downloads.

The repository is compact by widely used library standards. Our checkout contained 128 files, about 12,069 lines of source, and occupied 4.5 MB. GitHub identifies Python as the primary language, and the package supports Python 3.10 or newer. It has an Apache-2.0 license, 8 CI workflow files, and a tests directory. There is no Dockerfile, which is appropriate for a client library that runs inside another application rather than exposing its own service.

Sessions reuse HTTP/1.1 connections and persist cookies

A Session carries cookies, default headers, authentication, proxies, and certificate settings across HTTP/1.1 calls. It also returns connections to urllib3's pool when response bodies are consumed, avoiding a new connection for every request to the same host. Prepared requests let advanced callers alter the exact body or headers before sending. The documentation warns that directly preparing a Request can omit session and environment settings, so the session-aware preparation method is safer when CA bundles or proxies come from the environment.

What happened when we ran it

Our sandbox installed Requests at commit dae7ef6 in 37 seconds, adding 54 packages and using 63 MB on disk. The build then succeeded in 6 seconds. This ran in a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM, using Python 3.12 and no secrets. The repository itself was only 4.5 MB before dependencies, so most of the measured disk use belongs to the development and test environment rather than the client source.

Tests completed successfully after 85 seconds. Pytest reported 619 passed, 0 failed, and 15 skipped of 619. We preserve that harness summary exactly rather than recalculating its stated total. Pip-audit found 0 known vulnerabilities in the installed environment. These results are unusually clean for a library that sits on network, proxy, certificate, redirect, encoding, and authentication boundaries, although they describe one commit and one Python 3.12 environment.

The measurement signals also found 8 CI workflow files, no Dockerfile, and a tests directory. Our run did not make external service claims, measure request latency, or test every proxy and certificate arrangement. A passing suite means the checked-out project behaved as its tests expected in the sandbox. It does not replace an application's own checks against its authentication scheme, corporate proxy, CA store, retry rules, response sizes, or failure handling.

Requests waits indefinitely unless code sets a timeout

Requests v2.34.2 does not apply a timeout when the caller omits the argument. The quickstart warns that production code should set one on nearly every call because a program can otherwise hang indefinitely. Its timeout describes socket inactivity rather than a cap on the entire download. Applications with end-to-end deadlines need to account for that difference. A shared wrapper or Session subclass can apply a house default, but the base library leaves the value to each call.

TLS verification is enabled by default and should stay that way. A caller can provide a CA bundle, use environment variables for trusted roots, or attach a client certificate. The docs warn that verify=False accepts expired certificates and hostname mismatches, exposing the connection to interception. They also state that encrypted client private keys are unsupported. Those limits are concrete reasons to check Requests against an organization's certificate process before standardizing on it.

Streaming works, with connection and multipart limits

With stream=True, Requests v2.34.2 downloads headers first and defers the body. Iterating through content handles common transfer decoding, while raw access preserves the underlying bytes. The connection returns to the pool only after the body is consumed or the response is closed. A context manager is the safest pattern for code that may stop reading early. Without streaming enabled, the response body arrives immediately, a detail that open issue 7599 says one docstring describes ambiguously.

Large file downloads fit this model, but large multipart uploads need another package when the body must stream rather than load normally. The quickstart points those users to requests-toolbelt. Our installed environment used 63 MB before an application added such extras. SOCKS proxy support is optional as well. The split keeps the default package focused, though buyers should inventory proxy and upload requirements instead of assuming every HTTP feature belongs in the core distribution.

September 2026 work shows health beyond the May release

GitHub showed 54,281 stars and 235 combined open issues and pull requests. The last push was September 2, 2026, after the latest release, v2.34.2, shipped on May 14. Issue discussions were updated through September 5. That evidence shows current maintenance even though no newer release tag exists. The combined open count includes pull requests, and several recently updated issues began years ago, so neither 235 nor issue age alone measures defect severity.

The current queue contains real edge cases. Issue 6102 concerns non-Latin digest credentials, issue 5000 concerns no_proxy behavior, and issue 6990 concerns digest authentication when a URL path contains semicolons. Issue 7443 reports typing trouble for some JSON dictionaries after recent type changes. Most applications will never hit all four, but authentication, proxy, and typing-heavy users should build small reproductions with v2.34.2 before changing a shared dependency.

The 619 passing tests support a narrow recommendation

Requests remains our pick for ordinary synchronous HTTP/1.1 because its documentation states the sharp edges and our full run passed. The 37-second install and 6-second build make a trial cheap. Set timeouts, preserve TLS checks, close streams, and test unusual authentication or proxy behavior. Async services and HTTP/2 clients should start with HTTPX or aiohttp.

Alternatives

ProjectWhat it isPick it when
HTTPXA Python client with synchronous and asynchronous APIs plus HTTP/2 support.pick this instead when async calls, HTTP/2, or one API shared across sync and async code is required.
aiohttpAn asyncio-based HTTP client and server framework for Python.pick this instead when the application is built around asyncio and also benefits from server-side HTTP tools.
urllib3A lower-level Python HTTP client that already powers Requests' connection handling.pick this instead when direct pool, retry, and transport control matters more than Requests' higher-level API.

What people are saying

  1. [velocity-scout] psf/requests

Sources

  1. Requests repository and README
  2. Requests quickstart
  3. Requests advanced usage guide
  4. Requests v2.34.2 release
  5. Digest authentication issue 6102
  6. Proxy bypass issue 5000
  7. JSON typing issue 7443
  8. Digest URL semicolon issue 6990

More dev tools reviews

NativeScript · codex-desktop-linux · Recordly · storybook · julia · core · the whole board →