Rendering HTML Responses with aiohttp

Mar 3, 2024 ยท 2 min read

When building web applications with aiohttp, you'll often need to return HTML content to the client. aiohttp makes this easy by allowing you to directly return HTML strings or render templates.

Returning Raw HTML

You can directly return a string containing HTML from your route handler:

async def handle(request):
    return web.Response(text='<h1>Hello World</h1>', content_type='text/html')

This will send the raw HTML string in the response body.

Rendering Templates

For most real applications, you'll want to use a template engine instead of writing raw HTML strings. aiohttp supports multiple Python template engines like Jinja2 out of the box.

Here's an example using Jinja2:

import jinja2

template = jinja2.Template("<h1>Hello {{name}}</h1>")

async def handle(request):
    return web.Response(text=template.render(name='John'), 

This keeps your presentation logic separate from the route handlers.

Streaming HTML

For very large HTML responses, you may want to stream the output to avoid loading the entire string in memory.

You can do this by returning a StreamResponse instead of a normal Response:

async def handle(request):
    resp = web.StreamResponse()
    resp.content_type = 'text/html'
    await resp.prepare(request)

    await resp.write(bytes('<h1>Hello</h1>', 'utf-8'))
    return resp

Streaming the output chunk-by-chunk can improve memory usage for big pages.

In summary, aiohttp provides flexible options for returning HTML to clients, from raw strings to rendered templates to streaming output. Leveraging these can help build robust, production-ready web applications.

Browse by tags:

Browse by language:

The easiest way to do Web Scraping

Get HTML from any page with a simple API call. We handle proxy rotation, browser identities, automatic retries, CAPTCHAs, JavaScript rendering, etc automatically for you

Try ProxiesAPI for free

curl ""

<!doctype html>
    <title>Example Domain</title>
    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />


Don't leave just yet!

Enter your email below to claim your free API key: