Which Python Web Framework to Choose for 2023: Django, Flask, FastAPI or Tornado?

PrimerPy
8 min readFeb 2, 2023

--

Python is a powerful and versatile programming language that is used for a variety of applications. It is especially popular for web development, as it offers an array of frameworks that can be used to quickly and easily develop web applications. Among these frameworks are Django, Flask, FastAPI, and Tornado.

Django is a high-level Python web framework that enables rapid development of secure and maintainable websites. It follows the Model-Template-View (MTV) architectural pattern and provides an all-inclusive environment for building and deploying web applications.

Some of the key features of Django include:

  1. ORM (Object-Relational Mapping) system: Django provides a high-level ORM system for interacting with databases, allowing developers to interact with databases using Python code rather than writing raw SQL.
  2. Admin Panel: Django includes a powerful and user-friendly admin panel for managing the data in your application.
  3. URL routing: Django provides a simple, clean, and flexible URL routing system, making it easy to define patterns for processing incoming requests.
  4. Security: Django takes security seriously and provides several built-in security features, such as protection against SQL injection, cross-site scripting (XSS), and cross-site request forgery (CSRF) attacks.
  5. Template engine: Django includes a powerful template engine for separating presentation logic from application logic, making it easier to maintain and update your website over time.

Here’s an example of how to set up a Django project:

  • Install Django: First, you’ll need to install Django on your computer. You can do this by running the following command in your terminal or command prompt:
pip install Django
  • Create a Django project: Once you have Django installed, you can create a new project by running the following command in your terminal or command prompt:
django-admin startproject myproject

This will create a new directory called myproject that contains the basic structure of your Django project.

  • Run the development server: Next, navigate into the newly created myproject directory and run the following command to start the Django development server:
python manage.py runserver

This will start the development server and make your Django application accessible at http://127.0.0.1:8000/.

  • Create a Django app: Within your project, you can create one or more apps that handle different functionality. To create a new app, run the following command:
python manage.py startapp myapp

This will create a new directory called myapp that contains the basic structure of your Django app.

  • Define models: Models in Django represent the data in your application, and define the fields and behaviors of your data. You can define your models in the models.py file within your app directory. For example:
from django.db import models


class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publication_date = models.DateField()
  • Create database tables: Once you’ve defined your models, you can create the necessary database tables by running the following command:
python manage.py makemigrations
python manage.py migrate
  • Define views: Views in Django handle the logic for processing incoming HTTP requests and returning HTTP responses. You can define your views in the views.py file within your app directory. For example:
from django.shortcuts import render
from .models import Book

def book_list(request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})
  • Define URL patterns: URL patterns in Django determine how URLs are mapped to views. You can define your URL patterns in the urls.py file within your app directory. For example:
from django.urls import path
from . import views

urlpatterns = [
path('books/', views.book_list, name='book_list'),
]
  • Create templates: Templates in Django define the HTML structure of your pages. You can create your templates in the templates directory within your app directory. For example:
<h1>Book List</h1>

<ul>
{% for book in books %}
<li>{{ book.title }} by {{ book.author }}</li>
{% endfor %}
</ul>
  • Test your project: Finally, you can test your Django project by accessing the URL

Flask is a lightweight and flexible Python web framework that’s well-suited to small to medium-sized projects. Unlike Django, Flask does not include an ORM (Object-Relational Manager) or many other components out of the box, allowing you to choose the tools that are best suited to your specific requirements.

Some of the key features of Flask include:

  1. Simple: Flask has a small and simple core, making it easy to get started and understand how the framework works.
  2. Minimalistic: Flask does not include an ORM or many other components that you might find in other web frameworks, which can make it easier to understand and customize your application.
  3. Modular: Flask is designed to be highly modular, allowing you to add only the components you need and easily reuse code across different projects.
  4. Lightweight: Flask is a lightweight framework that’s well-suited to small to medium-sized projects, and can be easily deployed on various platforms and hosting environments.
  5. Large community: Flask has a large and active community of developers, making it easy to find help and resources when needed.

Here’s an example of how to set up a Flask project:

  • Install Flask: First, you’ll need to install Flask on your computer. You can do this by running the following command in your terminal or command prompt:
pip install Flask
  • Create a Flask application: To create a new Flask application, create a new Python file and import the Flask class. For example:
from flask import Flask

app = Flask(__name__)
  • Define a route: Next, you’ll need to define a route that your application will respond to. You can do this using the @app.route decorator. For example:
@app.route('/')
def index():
return 'Hello, World!'
  • Run the development server: To run your Flask application, you’ll need to use the run method of the Flask class. For example:
if __name__ == '__main__':
app.run(debug=True)

This will start the Flask development server and make your application accessible at http://127.0.0.1:5000/.

  • Render templates: To render templates in Flask, you’ll need to use the render_template method from the flask package. For example:
from flask import Flask, render_template

@app.route('/')
def index():
return render_template('index.html')
  • Create templates: The templates you render using the render_template method should be stored in a templates directory within your application directory. For example:
<html>
<head>
<title>My Flask App</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>

FastAPI is a modern, fast, web framework for building APIs with Python 3.7+ based on standard Python type hints. FastAPI is built on top of Starlette for the web parts, and Pydantic for the data parts.

Some of the key features of FastAPI include:

  1. Speed: FastAPI is one of the fastest web frameworks for building APIs, allowing you to handle a high volume of requests with low overhead.
  2. Type hints: FastAPI uses Python type hints to define the expected data for inputs and outputs, making it easier to write and understand your code, and reducing the need for manual validation.
  3. Easy to learn: FastAPI is designed to be easy to learn and use, with a simple and intuitive API that requires minimal boilerplate code.
  4. Async support: FastAPI supports asynchronous programming, allowing you to build scalable and responsive APIs that can handle a high volume of requests.
  5. Integration with popular libraries: FastAPI integrates well with popular Python libraries such as SQLAlchemy and Tortoise-ORM for database access, and has built-in support for handling request data, authentication, and more.

Here’s an example of how to set up a project in FastAPI:

  • Install FastAPI: First, you’ll need to install FastAPI on your computer. You can do this by running the following command in your terminal or command prompt:
pip install fastapi
  • Create a FastAPI application: To create a new FastAPI application, create a new Python file and import the FastAPI class. For example:
from fastapi import FastAPI


app = FastAPI()
  • Define a route: Next, you’ll need to define a route that your application will respond to. You can do this using the @app.get or @app.post decorator, depending on the HTTP method you want to handle. For example:
@app.get("/")
def read_root():
return {"Hello": "World"}
  • Run the development server: To run your FastAPI application, you can use the uvicorn command-line tool. For example:
uvicorn main:app --reload

This will start the FastAPI development server and make your application accessible at http://127.0.0.1:8000/.

  • Define request data: To define request data in FastAPI, you can use Python type hints and Pydantic models. For example:
from fastapi import FastAPI, Body
from pydantic import BaseModel


app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
async def create_item(item: Item):
return item

Tornado is a Python web framework and asynchronous networking library. It is well-suited for long-polling and WebSockets applications, making it ideal for real-time web applications, such as chat applications and online games.

Some of the key features of Tornado include:

  1. Async Support: Tornado is designed to be asynchronous from the ground up, making it easy to build fast and scalable applications.
  2. Non-blocking I/O: Tornado uses non-blocking I/O to handle a high number of connections efficiently, even under high load.
  3. Web Server: Tornado includes a web server that is optimized for performance, making it easy to deploy your applications to production.
  4. Support for WebSockets: Tornado has built-in support for WebSockets, making it easy to build real-time web applications.
  5. Coroutines: Tornado uses coroutines for its asynchronous API, making it easy to write clean, readable code.
  6. Easy to use: Tornado has a simple API that makes it easy to get started with web development, even for those who are new to web programming.

Tornado is well-suited for building high-performance web applications that require real-time communication and a high level of scalability. Whether you’re building a chat application or a real-time game, Tornado provides a powerful toolset for building fast, scalable, and efficient web applications.

Here’s an example of how to set up a Tornado project:

  • Install Tornado: First, you’ll need to install Tornado on your computer. You can do this by running the following command in your terminal or command prompt:
pip install tornado
  • Create a Tornado application: To create a new Tornado application, create a new Python file and import the tornado.web and tornado.ioloop modules. For example:
import tornado.web
import tornado.ioloop


class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
  • Run the application: To run your Tornado application, simply run the Python file you created in step 2. For example:
python myapp.py

This will start the Tornado development server and make your application accessible at http://localhost:8888/.

  • Add request handlers: To handle different requests, you’ll need to create additional RequestHandlers and add them to your Tornado application. For example:
class AboutHandler(tornado.web.RequestHandler):
def get(self):
self.write("This is the about page")

def make_app():
return tornado.web.Application([
(r"/", MainHandler),
(r"/about", AboutHandler),
])

The best Python framework to use depends on the specific requirements and goals of your project.

If you’re building a traditional, monolithic web application with a relational database, Django might be the best choice.

If you’re building a small, simple API, Flask might be a good option.

FastAPI is a relatively new framework that’s designed for building high-performance APIs. It’s based on Starlette for the web parts, and Pydantic for the data parts. It is a great option if you want to build fast and modern APIs.

Tornado is a mature, non-blocking web framework that’s well suited to building real-time applications, such as chat applications and online games.

Ultimately, the best framework for you will depend on the needs of your project, and the experience of your development team. Consider researching and evaluating each framework in depth to determine which is the best fit for your particular use case.

--

--

PrimerPy

www.primerpy.com | A Primer on Python. I'm a veteran Data and Web developer based out of NYC and DC area. I blog mainly on Python and other tech related topics.