close icon
daily.dev platform

Discover more from daily.dev

Personalized news feed, dev communities and search, much better than whatโ€™s out there. Maybe ;)

Start reading - Free forever
Start reading - Free forever
Continue reading >

FastHTML: Everything you need to know about this modern web framework in pure Python

FastHTML: Everything you need to know about this modern web framework in pure Python
Author
Nimrod Kramer
Related tags on daily.dev
toc
Table of contents
arrow-down

๐ŸŽฏ

FastHTML is a lightweight Python web framework for building fast, scalable web applications. Learn about its key features, setup process, and comparisons with other frameworks.

FastHTML is a lightweight Python web framework for building fast, scalable web applications. Here's what you need to know:

  • Pure Python: Built entirely in Python, making it easy to learn and use
  • Component-based: Uses reusable components for efficient development
  • Fast and flexible: Suitable for small to medium-sized projects
  • Easy setup: Simple installation and project creation process
  • Key features: Components, templates, views, and models

Quick comparison with other frameworks:

Feature FastHTML Flask Django
Complexity Simple Medium Complex
Size Light Medium Heavy
Ease of use Easy Medium Hard
Customization High Medium Low

FastHTML offers a balance of simplicity and power, making it a good choice for developers who want a pure Python solution without the complexity of larger frameworks.

FastHTML basics

FastHTML

Core concepts of FastHTML

FastHTML uses these main ideas to build web apps:

  • Components: Reusable code pieces for web pages
  • Templates: HTML files with special syntax for adding dynamic data
  • Views: Functions that handle web requests and responses
  • Models: Classes that work with data and business logic

Main features

FastHTML offers these key features:

Feature Description
Speed Fast and light for small to medium web projects
Learning curve Simple API, easy to pick up
Flexibility Can build many types of web apps
Customization Can be changed to fit specific needs

How FastHTML compares to Flask and Django

Flask

Here's how FastHTML is different from Flask and Django:

Aspect FastHTML Flask Django
Complexity Simple Medium Complex
Size Light Medium Heavy
Ease of use Easy Medium Hard
Customization High Medium Low

FastHTML is simpler and lighter than Flask and Django. It's easier to learn, especially for new web developers. You can also change it more to fit what you need.

Setting up FastHTML

What you need to run FastHTML

To use FastHTML, you'll need:

How to install FastHTML

Follow these steps to install FastHTML:

  1. Open a terminal or command prompt
  2. Type this command:
pip install fasthtml
  1. Press Enter to install

Creating your first FastHTML project

Here's how to start a new project:

  1. Open a terminal and go to where you want to create your project
  2. Type this command (replace "myproject" with your project name):
fasthtml new myproject
  1. Go into the new project folder:
cd myproject
  1. Start the development server:
fasthtml run
  1. Open a web browser and go to http://localhost:8000
Step Action Command
1 Create project fasthtml new myproject
2 Enter project folder cd myproject
3 Start server fasthtml run
4 View in browser Go to http://localhost:8000

That's it! You've set up FastHTML and made your first project. Now you can start building your web app.

Key parts of FastHTML

Using components

FastHTML uses components to build web apps. Components are reusable code pieces that make up parts of your website. You can put components inside other components to make complex layouts.

Here's how to use a simple component in FastHTML:

from fasthtml import FastHTML, Component

class HelloWorld(Component):
    def render(self):
        return "Hello, World!"

app = FastHTML()
app.component(HelloWorld())

This code creates a HelloWorld component that shows "Hello, World!" and adds it to the app.

Managing data

FastHTML offers ways to handle data in your app. You can use the built-in State class or other tools like Redux.

Here's an example using the State class:

from fasthtml import FastHTML, State

app = FastHTML()
state = State({"count": 0})

def increment_count():
    state.update({"count": state.get("count") + 1})

app.route("/increment", increment_count)

This code sets up a counter and a function to increase it when the "/increment" URL is accessed.

Setting up routes

Routes in FastHTML connect URLs to functions in your app. Here's a simple example:

from fasthtml import FastHTML

app = FastHTML()

def hello_world():
    return "Hello, World!"

app.route("/hello", hello_world)

This code makes the "/hello" URL show "Hello, World!" when visited.

Handling events

FastHTML lets you respond to user actions like clicks. Here's how to handle a click event:

from fasthtml import FastHTML

app = FastHTML()

def handle_click():
    print("Button clicked!")

app.on("click", handle_click)

This code prints "Button clicked!" when a click event happens.

Feature Description Example
Components Reusable code pieces HelloWorld component
Data Management Storing and updating app data Using State class
Routes Connecting URLs to functions Setting up "/hello" route
Event Handling Responding to user actions Handling click events

Creating user interfaces

This section covers how to build user interfaces in FastHTML. We'll look at making reusable parts, adding styles, and making sure your app works on different screen sizes.

Building reusable components

Components are the basic building blocks of your web app. You can use them over and over in different parts of your app. Here's how to make a simple component:

from fasthtml import FastHTML, Component

class Button(Component):
    def render(self):
        return "<button>Click me!</button>"

app = FastHTML()
app.component(Button())

This code makes a Button component that you can use anywhere in your app.

Adding styles to your app

You can use CSS to make your app look good. You can add styles to one component or to the whole app. Here's how to add style to a component:

from fasthtml import FastHTML, Component

class Button(Component):
    def render(self):
        return "<button style='background-color: blue; color: white;'>Click me!</button>"

app = FastHTML()
app.component(Button())

This code changes the Button component to have a blue background and white text.

Making your app work on different screens

To make your app look good on all screen sizes, you can use responsive design. This means using CSS media queries to change styles based on screen size. Here's an example:

from fasthtml import FastHTML, Component

class Button(Component):
    def render(self):
        return """
        <button style='
            background-color: blue;
            color: white;
            padding: 10px 20px;
        '>
            Click me!
        </button>
        """

app = FastHTML()
app.component(Button())

app.add_style("""
    @media only screen and (max-width: 768px) {
        button {
            padding: 5px 10px;
        }
    }
""")

This code changes the Button component's padding when the screen is 768 pixels wide or less.

Feature What it does Example
Reusable components Makes parts you can use again and again Button component
Styles Adds CSS to make things look good Blue background for Button
Responsive design Makes your app work on all screen sizes Changing padding for small screens

Working with data and APIs

How to handle data in FastHTML

FastHTML lets you work with data easily. You can use Python objects to store and use data in your components. Here's an example:

from fasthtml import FastHTML, Component

data = {
    "name": "John Doe",
    "age": 30
}

class UserProfile(Component):
    def render(self):
        return f"<h1>{data['name']}</h1><p>Age: {data['age']}</p>"

app = FastHTML()
app.component(UserProfile())

This code stores user info in a dictionary and shows it in a user profile component.

Connecting to external APIs

To use external APIs, you can use the requests library in Python. You can send different types of requests (GET, POST, PUT, DELETE) to APIs and work with the answers. Here's how to get data from a JSON API:

import requests
from fasthtml import FastHTML, Component

class UserData(Component):
    def render(self):
        response = requests.get("https://api.example.com/users")
        data = response.json()
        return "<ul>" + "".join([f"<li>{user['name']}</li>" for user in data]) + "</ul>"

app = FastHTML()
app.component(UserData())

This code gets user data from an API and shows a list of user names.

Keeping data up-to-date

To keep your data fresh, you can use WebSockets or Webhooks. These tools help you get updates right away when data changes.

Here's how to use WebSockets with the websocket-client library:

import websocket
from fasthtml import FastHTML, Component

class RealtimeData(Component):
    def render(self):
        ws = websocket.create_connection("ws://example.com/ws")
        data = ws.recv()
        return f"<p>{data}</p>"

app = FastHTML()
app.component(RealtimeData())

This code sets up a WebSocket connection and shows live data.

Feature What it does Example
Data handling Uses Python objects to store and access data Dictionary for user info
API connections Sends requests to external APIs requests library for JSON data
Live updates Gets instant updates using WebSockets or Webhooks websocket-client for real-time data

Making your app faster

Speeding up page loading

To make pages load faster in FastHTML:

  • Combine CSS and JavaScript files
  • Use image sprites
  • Use fewer external libraries
  • Use FastHTML's built-in caching for common data
  • Compress images and use the right format (JPEG for photos, PNG for graphics)
  • Set image dimensions in the code

Loading content as needed

To load content only when it's needed:

  • Use lazy loading for images and videos not visible right away
  • Use pagination to load data in smaller parts

Using caching to improve speed

Caching helps reduce server load and speeds up page loading:

  • Use FastHTML's built-in caching for common data
  • Try external caching tools like Redis or Memcached
Technique What it does How to do it
Combine files Reduces HTTP requests Use a tool like Gzip for CSS files
Use caching Stores common data Use FastHTML's built-in caching
Optimize images Makes images load faster Use a tool like ImageOptim
Lazy loading Loads content when needed Load off-screen images later
Pagination Loads data in parts Show data in smaller chunks

These tips can help make your FastHTML app run faster and give users a better experience.

sbb-itb-bfaad5b

Testing and fixing bugs

Writing tests for FastHTML apps

Testing your FastHTML app helps make sure it works well and finds problems early. Here are some tips for good tests:

  • Keep tests simple and easy to understand
  • Test small parts of your app separately
  • Use FastHTML's built-in testing tools or other Python testing libraries

Here's a simple test using FastHTML's testing tools:

from fasthtml import FastHTMLTest

class TestMyApp(FastHTMLTest):
    def test_home_page(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed('home.html')

Testing how parts work together

After testing small parts, check how they work together. This is called integration testing. Here are some tips:

  • Test how users interact with your app
  • Check if your app talks to other services correctly
  • Use tools like Selenium or Playwright to test complex situations

Here's an example using Selenium:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get('http://localhost:8000')

# Test login
username_input = driver.find_element(By.NAME, 'username')
password_input = driver.find_element(By.NAME, 'password')
login_button = driver.find_element(By.NAME, 'login')

username_input.send_keys('testuser')
password_input.send_keys('testpassword')
login_button.click()

# Wait for login to finish
WebDriverWait(driver, 10).until(
    EC.title_contains('Dashboard')
)

driver.quit()

Tools for finding and fixing problems

Here are some tools to help find and fix problems in your FastHTML app:

Tool Type What it does Examples
Debuggers Help you look at your code step by step PDB, PyCharm debugger
Logging Keep track of what's happening in your app FastHTML's built-in logging, Loggly, Splunk
Error tracking Find and fix errors in your app Sentry, Rollbar

Here's how to use PDB to find a problem:

import pdb

def my_view(request):
    # Code that's causing a problem
    pdb.set_trace()
    return HttpResponse('Hello, world!')

Using these tools and tips can help make your FastHTML app work better and give users a good experience.

Launching your FastHTML app

Steps before going live

Before you launch your FastHTML app, take these steps:

  • Test thoroughly: Check your app on different devices, browsers, and operating systems to find bugs.
  • Make it faster: Use FastHTML's tools to find slow parts and speed them up.
  • Keep it safe: Add login systems and encrypt data to protect users.
  • Set up tracking: Use tools to watch how your app runs and what users do.

Where to host your app

You can host your FastHTML app in different places:

Hosting Option What it is
FastHTML's Server Good for testing, not for real use
PythonAnywhere Online place to put Python apps
Heroku Easy-to-use online platform with a free option
AWS Big online service with many tools
DigitalOcean Cheap online hosting for Python apps

Checking app performance

After your app is live, keep an eye on how it's doing:

  • Page load times: See how fast pages open using tools like Google PageSpeed.
  • Server speed: Check how fast your app answers user requests.
  • Errors: Look for problems that might slow down your app or bother users.
  • User behavior: See how people use your app and what they like or don't like.
What to Check Why It's Important
Page load times Shows if your app is fast enough
Server speed Tells you if your app can handle many users
Errors Helps you find and fix problems
User behavior Shows what parts of your app need work

Advanced FastHTML techniques

Rendering pages on the server

FastHTML lets you create pages on the server, which can make your app faster and easier to use. This is called Server-Side Rendering (SSR). To use SSR in FastHTML, you make a special function that gives back the HTML for a page. This function is called a "view function."

Here's a simple view function:

from fasthtml import FastHTML

app = FastHTML()

@app.view("/hello")
def hello_world():
    return "<h1>Hello, World!</h1>"

This hello_world function gives back a simple HTML string that says "Hello, World!". When someone goes to the /hello page, FastHTML uses this function and sends the HTML to the user's web browser.

Creating custom tools

You can make your own tools in FastHTML to use in your app. These tools can do things like check data, handle user logins, and more.

To make a custom tool, create a class that uses FastHTML.Tool. Here's a tool that checks if an email address looks right:

from fasthtml import FastHTML, Tool

app = FastHTML()

class EmailChecker(Tool):
    def check(self, email):
        if "@" not in email:
            return False
        return True

app.tools["email_checker"] = EmailChecker()

This EmailChecker class has a check method that looks for an "@" in the email. You can use this tool in your app by writing app.tools["email_checker"].check(email).

Using FastHTML with other Python libraries

You can use FastHTML with other Python libraries to add more features to your app. For example, you can use the requests library to get data from other websites.

Here's how to use the requests library with FastHTML:

from fasthtml import FastHTML
import requests

app = FastHTML()

@app.view("/api/data")
def get_api_data():
    response = requests.get("https://api.example.com/data")
    data = response.json()
    return data

This get_api_data function gets data from another website using the requests library. It then gives back the data as JSON.

Feature What it does Example
Server-Side Rendering Makes pages on the server View function for "/hello" page
Custom Tools Lets you make your own tools Email address checker
Using Other Libraries Adds more features to your app Getting data from other websites

These advanced techniques can help you make better FastHTML apps that do more and work faster.

FastHTML community and resources

Useful add-ons for FastHTML

FastHTML has add-ons that can make your app better. Here are some helpful ones:

Add-on What it does
FastHTML-Extensions Gives you ready-made parts for common tasks like user logins
FastHTML-UI Provides pre-made buttons, forms, and tables for your app's look
FastHTML-DB Helps you work with databases like SQLite and PostgreSQL

To use an add-on, install it with pip. For example:

pip install fasthtml-extensions

After installing, you can use the add-on in your FastHTML app.

Where to get help

If you need help with FastHTML, try these:

Resource Description
FastHTML Documentation Explains everything about FastHTML
FastHTML Community Forum Ask questions and get help from other users
FastHTML GitHub Repository Report bugs or ask for new features

How to help improve FastHTML

You can help make FastHTML better:

Way to help What to do
Report bugs Tell the developers about problems you find
Fix bugs or add features Make changes and send them to the developers
Join the community Talk with other users and give feedback

FastHTML vs. other frameworks

Pros and cons of different frameworks

When picking a web framework, it's important to know what each one does well and not so well. Here's how FastHTML compares to other popular frameworks:

Framework Good things Not so good things
FastHTML Uses only Python, easy to learn, quick, can be changed easily Not as many tools and help as other frameworks
Flask Light, can be split into parts, can be changed easily Not good for big, complex apps, doesn't have many built-in features
Django Does a lot, helps build apps quickly, keeps things safe Hard to learn at first, all parts are connected
Pyramid Can be changed easily, can be split into parts, works for big and small apps Hard to set up, not much help info

FastHTML is good because it only uses Python. This makes it a good choice for people who want a small, easy-to-change framework. But it might not have as many tools and help as other frameworks.

When to use FastHTML

Here's when you might want to use FastHTML:

When to use Why
Small to medium projects FastHTML is good for smaller projects or testing ideas
Quick building FastHTML is simple and easy to change, so you can build things fast
Python fans If you like using only Python, FastHTML is a good choice
Learning web building FastHTML is simple and easy to use, so it's good for learning

But if you're working on a big, complex app or need a framework with lots of built-in features, you might want to look at Django or Pyramid instead.

What's next for FastHTML

Upcoming features

The FastHTML team is working on new features to make the framework better:

  • Better WebSockets: This will help build apps that update in real-time.
  • More safety features: The team is adding ways to check user input and stop common web attacks.
  • Support for many languages: This will make it easier to build apps that people around the world can use.

How FastHTML might change Python web development

FastHTML could change how people build websites with Python. Here's how:

Change What it means
Simpler apps Developers might focus on building small, fast apps instead of big, complex ones.
More people using Python FastHTML's easy-to-use design might make more people choose Python for making websites.
New jobs for Python coders As FastHTML grows, Python coders might get more chances to work on big web projects.

FastHTML keeps things simple, easy to change, and fast. This could make a big difference in how people build websites with Python. As more people use FastHTML, Python coders might find new ways to use their skills.

Wrap-up

Main points to remember

FastHTML is a web framework that lets you build web apps using only Python. Here are the key things to know:

  • It's easy to learn and use, even for new web developers
  • It has a simple way to build web apps, good for quick projects
  • You can change it to fit what you need
  • It works well for busy websites
  • It has a growing group of users and lots of help available

Final thoughts on FastHTML

FastHTML is a new option for Python web developers. It's easy to use, works well, and you can change it to fit your needs. It's good for both experienced developers and beginners.

As more people use FastHTML, it will likely get better. The people who make it listen to what users want, so it should keep improving.

Why not try FastHTML? It's easy to start with, and you can quickly build web apps using just Python.

What FastHTML offers Why it's good
Easy to learn Simple to use, good for quick projects
Can be changed Fits what you need
Works well Good for busy websites
Growing user group Lots of help available

FAQs

What is FastHTML?

FastHTML is a new web framework for building web apps using Python. Here's what you need to know:

Feature Description
Purpose Makes fast, big web apps with less code
Uses ASGI and HTMX for better performance
Deployment Works with Vercel CLI or git push

FastHTML helps you:

  • Build web apps quickly
  • Use less code
  • Make apps that work well for many users

You can put your app online using Vercel CLI or by pushing your code to git. This makes it easy to share your app with others.

Related posts

Why not level up your reading with

Stay up-to-date with the latest developer news every time you open a new tab.

Read more