<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ganesh Palanikumar</title>
    <description>The latest articles on DEV Community by Ganesh Palanikumar (@ganesh_palanikumar).</description>
    <link>https://dev.to/ganesh_palanikumar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3243277%2F7cce80d6-79a2-468d-a49d-050a04f46170.jpg</url>
      <title>DEV Community: Ganesh Palanikumar</title>
      <link>https://dev.to/ganesh_palanikumar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ganesh_palanikumar"/>
    <language>en</language>
    <item>
      <title>Meet areq: Async Python Requests Without Losing Your Sanity</title>
      <dc:creator>Ganesh Palanikumar</dc:creator>
      <pubDate>Tue, 08 Jul 2025 19:12:00 +0000</pubDate>
      <link>https://dev.to/ganesh_palanikumar/meet-areq-async-python-requests-without-losing-your-sanity-l95</link>
      <guid>https://dev.to/ganesh_palanikumar/meet-areq-async-python-requests-without-losing-your-sanity-l95</guid>
      <description>&lt;p&gt;Like many of you, I’ve written my fair share of Python scripts that use &lt;code&gt;requests&lt;/code&gt;. It’s simple. It works. And it has become almost muscle memory at this point.&lt;/p&gt;

&lt;p&gt;The story starts with a simple piece of code that looks something like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://jsonplaceholder.typicode.com/todos/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response_json&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Text:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s clean, concise, easily testable.&lt;/p&gt;

&lt;p&gt;But then your application grows. Maybe you’re hitting hundreds of APIs, or building a web scraper . But now, your trusty synchronous code is no longer snappy. It starts to slow down. And someone suggests why not go async? The idea sticks in your head. It seems elegant, almost inevitable.&lt;/p&gt;

&lt;p&gt;So, you start the refactor.  You read up on &lt;code&gt;httpx&lt;/code&gt;, the de-facto library for anyone wanting to make async requests. And it does seem simple - at first. But after refactoring and debugging, you are left with this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://jsonplaceholder.typicode.com/todos/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;response_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Text:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great. You have joined the async revolution. But something feels weird. So many changes just to get the async flow to work!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;httpx.AsyncClient() context manager&lt;/li&gt;
&lt;li&gt;client.get() returns a coroutine that must be awaited&lt;/li&gt;
&lt;li&gt;exceptions raised are no longer &lt;code&gt;requests.exceptions.RequestException&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a refactoring perspective, I am definitely more nervous and less confident about the &lt;code&gt;httpx&lt;/code&gt; code than the &lt;code&gt;requests&lt;/code&gt; code. Not because &lt;code&gt;httpx&lt;/code&gt; is a bad library, but because the affected area is a lot. If something goes wrong, it is going to be very hard to debug. Plus, I no longer recognize the code or the idioms.&lt;/p&gt;

&lt;p&gt;This was exactly the problem I was trying to solve. A clean way to move from synchronous workflows using requests to asynchronous workflows using &lt;code&gt;httpx&lt;/code&gt; without losing your sanity. &lt;/p&gt;

&lt;p&gt;This led me to build &lt;code&gt;areq&lt;/code&gt;: a minimal async drop-in replacement for requests. No weird new interfaces, no extra ceremony. Async where you want it. Familiarity where you expect it. The same code using &lt;code&gt;areq&lt;/code&gt; would be like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;areq&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;areq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://jsonplaceholder.typicode.com/todos/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Text:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. No extra configs, no new types to learn. No special idioms. Yes, I had to add async-await wherever required. But almost nothing else has changed. What’s more,  &lt;code&gt;isinstance(response, requests.Response)&lt;/code&gt; returns True!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No boilerplate context managers&lt;/li&gt;
&lt;li&gt;No new Response object to learn&lt;/li&gt;
&lt;li&gt;Type checks and except clauses remain same&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who did I build for?
&lt;/h2&gt;

&lt;p&gt;The goal behind &lt;code&gt;areq&lt;/code&gt; is simple: Bring async benefits to your software without wrecking your code (or your brain). You get the familiar ergonomics of &lt;code&gt;requests&lt;/code&gt;, and the performance benefits of async. No rewrites, no API mental overhead. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;areq&lt;/code&gt; is nothing fancy: it is just a simple wrapper over &lt;code&gt;httpx&lt;/code&gt;. But I feel it will be really useful for some people.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Teams migrating to async gradually
&lt;/h3&gt;

&lt;p&gt;You don’t always have the luxury to stop everything and refactor your entire codebase for async. With &lt;code&gt;areq&lt;/code&gt;, you can start adopting async piece by piece, keeping the rest of your logic intact.&lt;/p&gt;

&lt;p&gt;Want to convert just one function? One endpoint? One module? No problem.&lt;br&gt;
&lt;code&gt;areq&lt;/code&gt; enables you to do just that, without breaking .ok, type assertions or your test mocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 People who eventually want to move to &lt;code&gt;httpx&lt;/code&gt; (but not today)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;areq&lt;/code&gt; isn’t here to compete with &lt;code&gt;httpx&lt;/code&gt;.&lt;br&gt;
In fact, it can be your on-ramp to &lt;code&gt;httpx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can use &lt;code&gt;areq&lt;/code&gt; to unlock async performance now—without rewriting everything. Later, once you’ve stabilized your logic and gathered profiling data, you can move to native &lt;code&gt;httpx&lt;/code&gt; for deeper control or streaming needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧵 Builders of CLI tools, background jobs, and lightweight APIs
&lt;/h3&gt;

&lt;p&gt;If you’re working on scrapers, bots, micro services or any software that needs concurrency but don’t want the full mental load of switching to a new request paradigm, &lt;code&gt;areq&lt;/code&gt; is for you. It gives you async without ceremony.&lt;/p&gt;

&lt;h3&gt;
  
  
  💼 Teams maintaining legacy requests code
&lt;/h3&gt;

&lt;p&gt;Your old requests code works fine. It’s battle-tested.&lt;br&gt;
Now you just want it to go faster.&lt;br&gt;
&lt;code&gt;areq&lt;/code&gt; lets you do that.&lt;br&gt;
No rewrite. No breakage. No angry regression tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Under the Hood?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;areq&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;httpx.AsyncClient&lt;/code&gt; under the hood.&lt;/li&gt;
&lt;li&gt;Converts the response to a requests.Response lookalike.&lt;/li&gt;
&lt;li&gt;Converts common &lt;code&gt;httpx&lt;/code&gt; exceptions (e.g. &lt;code&gt;httpx.ConnectTimeout&lt;/code&gt;) into &lt;code&gt;requests.exceptions.RequestException&lt;/code&gt; subclasses.&lt;/li&gt;
&lt;li&gt;Supports all basic HTTP verbs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not a full replacement for everything &lt;code&gt;httpx&lt;/code&gt; or &lt;code&gt;requests&lt;/code&gt; can do, but it covers 90% of practical use cases, especially when you’re trying to modernize an old codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Known Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Streaming and advanced session handling are not supported (yet!)&lt;/li&gt;
&lt;li&gt;The response object is a subclass of requests.Response, but cannot be treated as same in all scenarios.
But hey—it’s early. And it works for most real-world use cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing and Using &lt;code&gt;areq&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;It is very easy to install &lt;code&gt;areq&lt;/code&gt;. You can install it from PyPi just like any other python package.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install areq&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How You Can Help
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Star the &lt;a href="//github.com/ganesh-palanikumar/areq"&gt;repo&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Starring the repo helps more people discover &lt;code&gt;areq&lt;/code&gt;, and lets you keep up to date with features as they roll out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use it in your code!
&lt;/h3&gt;

&lt;p&gt;Take &lt;code&gt;areq&lt;/code&gt; for a spin. Use it in your code, tell me what breaks. File an &lt;a href="https://github.com/ganesh-palanikumar/areq/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Suggest features
&lt;/h3&gt;

&lt;p&gt;Want streaming support? Cookie handling? What is that one feature that will make your life so much better?&lt;/p&gt;

&lt;h3&gt;
  
  
  Contribute!
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;areq&lt;/code&gt; is open sourced under MIT license. It is also my project with me as the sole developer. As such, if you have a cool idea, do fork the repository, implement and put up a PR. I will definitely review it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spread the word
&lt;/h3&gt;

&lt;p&gt;Tell your friends and colleagues. Blog about it - the good, the bad and the ugly. The more people who use &lt;code&gt;areq&lt;/code&gt;, the better it is going to become. &lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Sometimes all you need is a small wrapper that respects your old habits.&lt;br&gt;
That’s &lt;code&gt;areq&lt;/code&gt;. It won’t save the world, but it’ll save you a few afternoons.&lt;/p&gt;

&lt;p&gt;If you’ve ever:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wanted to “just make it async” without rewriting everything&lt;/li&gt;
&lt;li&gt;been burned by subtle differences between &lt;code&gt;requests&lt;/code&gt; and &lt;code&gt;httpx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Or you just want to make your trusty legacy code run a bit faster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;code&gt;areq&lt;/code&gt; might just be your new favorite micro-library.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
