To support both blocking and fire-and-forget HTTP requests clearly, the best approach is to use Python’s asyncio with an explicit flag like fire_and_forget=True. This way, the default behavior remains blocking—ensuring the response is available before continuing—while still giving developers the option to run non-blocking background tasks when needed. Using asyncio.create_task(...) allows you to fire off tasks without waiting for them, and wrapping this in a simple HttpClient class makes the code clean and easy to use. It’s also a good idea to document this clearly so that others know what to expect and don’t get surprised by silent failures in fire-and-forget mode.