mrkeyoor.com_
Wed 21 Oct 20:04 UTC
Dev Toolsevaluationupdated 17 Oct 2026

requests review

Requests is a Python library for fetching web pages and sending data to HTTP APIs. It handles details such as encoded parameters, cookies, and certificate checks so you can concentrate on what your program sends and receives.

+72stars / 7d
Verdict

Our Requests run installed in 20 seconds, used 64 MB, and passed its pytest step with 619 passed, 0 failed, and 15 skipped, making it an easy choice for ordinary synchronous HTTP work. Use it for scripts and integrations where readable HTTP/1.1 calls matter. Choose an async client when blocking would hold up your application, and set explicit timeouts whichever workload you build around Requests.

We ran it

Lab card: what happened when we ran requestsScreenshot of requests (requests.readthedocs.io/en/latest)
Install✓ · 20s54 packages · 64 MB
Build✓ · 1s
Tests✓ · 81s619 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 20 seconds (54 packages), and the build succeeded in 1 seconds. We cloned commit 611c616 into a clean Debian container with 3 CPUs and no project-specific setup.

Do requests's tests pass?

Yes. The project's own test command finished in 81 seconds and reported 619 passed, 0 failed, 15 skipped (pytest).

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 handlers that need nonblocking network calls: the advanced guide says the default transport blocks, including streaming reads.

What are the alternatives to requests?

HTTPX, aiohttp. Our Requests run installed in 20 seconds, used 64 MB, and passed its pytest step with 619 passed, 0 failed, and 15 skipped, making it an easy choice for ordinary synchronous HTTP work.

Setup5/520-second install, 64 MB environment, and a successful build
Docs5/5Runnable examples and explicit timeout, Session, and blocking guidance
Community5/554,468 stars, a September push, and October issue activity
Maturity5/5619 passed, 0 failed, 15 skipped, with 8 CI workflow files

Discussed on

  1. hnRequests moved to Python Software Foundation111 points
  2. hnWhat3Words submitting takedown requests against Tweets [pdf]87 points
  3. hnCVE-2024-47081: Netrc credential leak in PSF requests library62 points
  4. hnReport on Government Information Requests [pdf]37 points
  5. hnEC proposed measures for Apple interoperability requests [pdf]5 points

Who it’s for

Developers writing scheduled exports, command-line utilities, or internal integrations that can wait for each HTTP call.
Teams maintaining synchronous Python services that need persistent cookies and reusable connections through a Session.
Engineers who want readable HTTP/1.1 code with documented authentication, proxy, and download support.

Who it’s NOT for

Async handlers that need nonblocking network calls: the advanced guide says the default transport blocks, including streaming reads.
Applications expecting automatic request deadlines: the quickstart says requests have no timeout unless the caller supplies one.
Teams maintaining Python 3.9 applications: the README requires Python 3.10+, and the release history records the older interpreter's removal.
Strictly typed integrations requiring clean iter_lines annotations: open issue 7630 reports a valid None chunk size being rejected by type checkers.
Multipart callers relying on non-string field names: open issue 7634 reports an AttributeError when files are attached.

Setup reality

Our sandbox installed commit 611c616 in 20 seconds, adding 54 packages and using 64 MB on disk. The build succeeded in 1 second. Pytest succeeded in 81 seconds with 619 passed, 0 failed, and 15 skipped in the supplied summary. Pip-audit reported 0 known vulnerabilities.

Requests needs Python 3.10+ and an HTTP endpoint to call. It requires no Requests account, hosted control service, or project API key. Credentials depend on the destination API, while private networks may need proxy settings or a trusted certificate bundle.

The library uses blocking calls, even when reading a download in pieces. Set a timeout explicitly because calls otherwise have no limit. Our Debian run used Python 3.12, 3 CPUs, 8 GB of RAM, and no secrets. Its successful checks do not establish behavior on every supported platform.

Requests fits a script that can wait for HTTP

Requests lets a Python script fetch a page, submit a form, or call a JSON API without building HTTP messages by hand. Its README promises HTTP/1.1, persistent cookies, connection pooling, and certificate verification. That's the appeal for a scheduled export or an internal integration: the network code stays readable enough that the next developer can see which address receives which data. You're buying less code to maintain.

Our checkout contained 128 files and roughly 12,069 lines of source, occupying 4.5 MB before installation. The installed environment used 64 MB. Those are useful proportions for someone considering the source repository, though they don't describe the size of a minimal application deployment. The 54 packages installed in our sandbox belong to that measured environment. Calling them all mandatory runtime dependencies would misrepresent what the lab established.

What happened when we ran it

Our run installed Requests commit 611c616 in 20 seconds and built it in 1 second on October 12, 2026. The measurement setup was an unprivileged Debian container using ghcr.io/astral-sh/uv:python3.12-bookworm, with 3 CPUs, 8 GB of RAM, and no secrets. Both steps succeeded. That supports a straightforward conclusion: this checkout completed those steps without a privileged container or credentials in the environment we used.

Pytest succeeded in 81 seconds, reporting 619 passed, 0 failed, and 15 skipped in the supplied lab summary. We keep the skipped result visible because a passing command doesn't mean every case ran. No failure log needs explaining here. These results concern the checked-out source and this sandbox, rather than every supported interpreter, operating system, or downstream integration that might use Requests.

Pip-audit reported 0 known vulnerabilities. The repository scan found 8 CI workflow files and a tests directory, with no Dockerfile. That is reassuring evidence for a library you embed in another program. It does not measure request latency or throughput, and the audit result belongs to this dependency environment on that date. Neither result promises that your application handles hostile responses or unreliable services correctly.

Timeouts require a decision in your calling code

The Requests timeout documentation says calls have no timeout unless you supply one. A forgotten argument can leave a worker waiting indefinitely. Set a policy where your application creates requests, then handle timeout exceptions where the job can recover. The timeout also isn't a deadline for downloading the entire response. That distinction matters when a remote endpoint keeps sending small amounts of data without finishing.

The 81 seconds our suite took tells you nothing about how long a production call should wait. Choose that limit from your job's deadline and the service you're calling. Also check HTTP status before treating parsed JSON as a successful result: an error response can contain perfectly valid JSON. Requests makes sending the request convenient, while your integration still owns what a response means and whether to try again.

Streaming downloads still use blocking calls

The advanced guide's blocking I/O section explicitly says the default transport does not provide nonblocking I/O. Downloading a response in pieces changes how much you read at once, but those reads still block. For a serial maintenance script, that is easy to reason about. Inside an async request handler, making the same call directly can hold up unrelated work on the event loop.

Python 3.12 in our sandbox was a suitable environment for the README's Python 3.10+ requirement. That compatibility doesn't turn Requests into an async client. HTTPX supports synchronous and asynchronous APIs plus HTTP/2, making it the alternative I'd try when those requirements appear. aiohttp supplies an asyncio client, server, and WebSocket support if the application already revolves around asyncio. Neither recommendation rests on a speed comparison from our lab.

Typed code and multipart forms have specific open complaints

Release v2.34.2, published May 14, 2026, changed the headers input annotation back to Mapping after the preceding release used MutableMapping. That is a small change with consequences for typed integrations. Open issue 7630 reports that iter_lines rejects a valid None chunk size during type checking. The release history shows attention to annotations, while this report gives strict typing users a concrete case to check.

Issue 7634, updated October 16, reports that non-string form field names accepted for ordinary form encoding raise AttributeError when files make the request multipart. This is a user report, separate from our 619 passing cases. If your application constructs field names from external data, validate those names before submission. Developers who require identical handling across both encodings have a specific reason to evaluate another client rather than assume compatibility.

September pushes and October reports show ongoing activity

GitHub recorded the last push on September 28, 2026, with 54,468 stars and 244 open issues and PRs when checked on October 17. October issue updates show continuing user activity after the May release. Those dates don't establish a maintainer response deadline, but they do undermine a claim that the release date alone means abandonment. Apache-2.0 licensing also gives adopters a clear code license.

The 64 MB environment makes working on this checkout a modest commitment in our sandbox. For a real integration, I'd spend the next effort on its actual endpoint: send an expired credential, interrupt a response, and check what the caller records. Reuse a Session for repeated calls when cookies or pooled connections matter. Keep the timeout policy beside that Session so a later call doesn't quietly inherit an unlimited wait.

Alternatives

ProjectWhat it isPick it when
HTTPXA Python HTTP client with synchronous and asynchronous APIs and HTTP/2 support.pick this instead when an application needs native async calls or HTTP/2 alongside a familiar client API.
aiohttpAn asyncio HTTP client and server library with WebSocket support.pick this instead when your application already uses asyncio and also needs client or server WebSockets.

What people are saying

  1. [hackernews] Incident with Actions, Pull Requests and Issues
  2. [hackernews] GitHub Incident with Git Operations, Pull Requests and Actions
  3. [hackernews] Replacing Pull Requests with Delta

Sources

  1. Requests README and repository
  2. Requests quickstart: responses, status codes, and timeouts
  3. Requests advanced usage: Sessions, blocking I/O, and timeout behavior
  4. Requests v2.34.2 release
  5. Issue 7630: iter_lines chunk size annotation
  6. Issue 7634: non-string multipart form field names
  7. HTTPX official documentation
  8. aiohttp official documentation

More dev tools reviews

mkdocs-material · awesome-cheatsheets · webrtc · dsh-pet · Ghostex · Codync · the whole board →