Skip to main content

fast_html is a fast, minimalist HTML generator.

It is an alternative to templating engines, like Jinja, for use with, e.g., htmx.

Pros:

  • use familiar python syntax

  • use efficient concatenation techniques

  • optional automatic indentation

Unlike other HTML generators (e.g. Dominate) that use python objects to represent HTML snippets, fast_html represents HTML snippets using string generators that can be rendered extremely fast using join. (see here)

Like other HTML generators, one needs to remember:

  • the name of some tags and attributes is changed (e.g., class_ instead of class, due to Python parser)

  • there may be conflicts of function names with your code base

Installation

pip install fast_html or copy the (single) source file in your project.

Don't forget to add a star on GitHub <https://github.com/pcarbonn/fast_html>_ ! Thanks.

Tutorial:

>>> from fast_html import *

A tag is created by calling a function of the corresponding name, and rendered using render:

>>> print(render(p("text")))
<p>text</p>

Tag attributes are specified using named arguments:

>>> print(render(br(id=1)))
<br id="1">

>>> print(render(br(id=None)))
<br>

>>> print(render(ul(li("text", selected=True))))
<ul><li selected>text</li></ul>

>>> print(render(ul(li("text", selected=False))))
<ul><li>text</li></ul>

The python parser introduces some constraints:

  • The following tags require a trailing underscore: del_, input_, map_, object_.

  • The following tag attributes require a trailing underscore: class_, for_.

In fact, the trailing underscore in attribute names is always removed by fast_html, and other underscores are replaced by -. For example, the htmx attribute hx-get is set using hx_get="url".

>>> print(render(object_("text", class_="s12", hx_get="url")))
<object class="s12" hx-get="url">text</object>

>>> print(render(button("Click me", hx_post="/clicked", hx_swap="outerHTML")))
<button hx-post="/clicked" hx-swap="outerHTML">Click me</button>

The innerHTML can be a list:

>>> print(render(div(["text",
...                    span("item 1"),
...                    span("item 2")
...                  ])))
<div>text<span>item 1</span><span>item 2</span></div>

The innerHTML can also be a list of lists:

>>> print(render(div(["text",
...                   [span(f"item {i}") for i in [1,2]]
...                  ])))
<div>text<span>item 1</span><span>item 2</span></div>

>>> print(render([br(), br()]))
<br><br>

You can call generators too:

>>> def row(number, name):
...     yield "<tr>"
...     yield td(number)
...     yield td(name)
...     yield "</tr>"
>>> def table():
...     yield "<table>"
...     yield from row("1", "A")
...     yield from row("2", "B")
...     yield "</table>"
>>> print(render(table()))
<table><tr><td>1</td><td>A</td></tr><tr><td>2</td><td>B</td></tr></table>

The innerHTML can also be specified using the i parameter, after the other attributes, to match the order of rendering:

>>> print(render(ul(class_="s12", i=[
...                 li("item 1"),
...                 li("item 2")]
...      )))
<ul class="s12"><li>item 1</li><li>item 2</li></ul>

You can create your own tag using the tag function:

>>> def my_tag(inner=None, **kwargs):
...     yield from tag("my_tag", inner, **kwargs)
>>> print(render(my_tag("text")))
<my_tag>text</my_tag>

Options:

By default, the inner string of a tag is not escaped: characters &, < and > in it are not converted to HTML-safe sequences.

>>> print(render(p("<bold>text</bold>")))
<p><bold>text</bold></p>

Of course, you can escape strings before calling fast_html:

>>> from html import escape
>>> print(render(p(escape("<bold>text</bold>"))))
<p>&lt;bold&gt;text&lt;/bold&gt;</p>

If your policy is to escape every inner string, you can activate escaping by setting the variable escape to True (or by calling escape_it(True)).

>>> escape_it(True)
>>> print(render(p("<bold>text</bold>")))
<p>&lt;bold&gt;text&lt;/bold&gt;</p>

When debugging your code, you can set global variable indent to True (or call indent_it(True)) to obtain HTML with tag indentation, e.g.,

>>> indent_it(True)
>>> print(render(div(class_="s12", i=["text\n", span("item 1"), span("item 2")])))
<div class="s12">
  text
  <span>
    item 1
  </span>
  <span>
    item 2
  </span>
</div>
<BLANKLINE>

You can also convert an HTML string to a function-based code representation:

>>> print(html_to_code('<div class="example"><p>Some text</p></div>'))
[div([p(['Some text'], )], class_="example")]

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fast_html-1.0.12.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fast_html-1.0.12-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file fast_html-1.0.12.tar.gz.

File metadata

  • Download URL: fast_html-1.0.12.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.8.0-57-generic

File hashes

Hashes for fast_html-1.0.12.tar.gz
Algorithm Hash digest
SHA256 2a8dc0fa97e18481f5260c9d74bb8a0a09ce4339ede0708dfe605b281cb5211f
MD5 0a7eb8b8cf95555f98193ee242513e79
BLAKE2b-256 07ed728ce00793837c858a7ce787b13c238ff6ce660878dcb72c2fb8994cd411

See more details on using hashes here.

File details

Details for the file fast_html-1.0.12-py3-none-any.whl.

File metadata

  • Download URL: fast_html-1.0.12-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.8.0-57-generic

File hashes

Hashes for fast_html-1.0.12-py3-none-any.whl
Algorithm Hash digest
SHA256 b93a6f5326484a7930ebb872ac8c4aa0afb7b8c6e85611064f39d360651fefe5
MD5 50e2c5e6bd8e88ee6e95d140ac2945da
BLAKE2b-256 a93117f12a12a4f453882cf95623c29ba763353bf43ef9518da8209f69f7054d

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.0.12 This release

2 files

1.0.11

2 files

1.0.10

2 files

1.0.9

2 files

1.0.8

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

1.0.4

2 files

1.0.3

2 files

1.0.2

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page