FastAPI is built on top of Starlette for the web parts and Pydantic for the data parts. It leverages Python type hints to perform automatic data validation, serialization, and deserialization. FastAPI uses an asynchronous programming model, which allows it to handle a large number of concurrent requests efficiently. It also generates interactive API documentation automatically using OpenAPI and Swagger UI.
Django REST Framework is an extension of the Django web framework. It provides a set of tools and views to simplify the process of building RESTful APIs. DRF follows the Django philosophy of convention over configuration, providing a high - level of abstraction. It integrates well with Django’s ORM, authentication, and permission systems.
To install FastAPI, you can use pip
:
pip install fastapi uvicorn
Here, uvicorn
is an ASGI server that can run FastAPI applications.
First, install Django:
pip install django
Then, install Django REST Framework:
pip install djangorestframework
Add rest_framework
to your INSTALLED_APPS
in your Django project’s settings.py
file:
INSTALLED_APPS = [
#...
'rest_framework',
#...
]
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
To run the FastAPI application, use the following command:
uvicorn main:app --reload
First, create a new Django project and an app:
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
In myapp/models.py
:
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
In myapp/serializers.py
:
from rest_framework import serializers
from .models import Item
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = '__all__'
In myapp/views.py
:
from rest_framework import viewsets
from .models import Item
from .serializers import ItemSerializer
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
In myproject/urls.py
:
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from myapp.views import ItemViewSet
router = DefaultRouter()
router.register(r'items', ItemViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
Run the Django development server:
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
FastAPI uses Pydantic for data validation. You can define data models using Pydantic classes:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
def create_item(item: Item):
return item
FastAPI will automatically validate the incoming data against the Item
model.
DRF uses serializers for data validation. In the previous example, the ItemSerializer
class validates the data when creating or updating an Item
object:
serializer = ItemSerializer(data={'name': 'New Item', 'price': 9.99})
if serializer.is_valid():
item = serializer.save()
else:
errors = serializer.errors
FastAPI can integrate with various authentication mechanisms. For example, using HTTP Basic Auth:
from fastapi import Depends, FastAPI, HTTPException
from fastapi.security import HTTPBasic, HTTPBasicCredentials
import secrets
app = FastAPI()
security = HTTPBasic()
def get_current_username(credentials: HTTPBasicCredentials = Depends(security)):
correct_username = secrets.compare_digest(credentials.username, "admin")
correct_password = secrets.compare_digest(credentials.password, "password")
if not (correct_username and correct_password):
raise HTTPException(
status_code=401,
detail="Incorrect email or password",
headers={"WWW-Authenticate": "Basic"},
)
return credentials.username
@app.get("/users/me")
def read_current_user(username: str = Depends(get_current_username)):
return {"username": username}
DRF has built - in support for various authentication and authorization classes. For example, to use Token Authentication:
First, add rest_framework.authtoken
to your INSTALLED_APPS
in settings.py
:
INSTALLED_APPS = [
#...
'rest_framework.authtoken',
#...
]
Run python manage.py migrate
to create the necessary database tables.
Then, in your settings.py
, set the authentication classes:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
You can then use the IsAuthenticated
permission class in your views:
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ModelViewSet
from .models import Item
from .serializers import ItemSerializer
class ItemViewSet(ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
permission_classes = [IsAuthenticated]
FastAPI itself does not have a built - in ORM. You can use external ORMs like SQLAlchemy. Here is a simple example of using SQLAlchemy with FastAPI:
from fastapi import FastAPI
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
app = FastAPI()
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
Base.metadata.create_all(bind=engine)
@app.post("/items/")
def create_item(name: str):
db = SessionLocal()
item = Item(name=name)
db.add(item)
db.commit()
db.refresh(item)
db.close()
return item
DRF integrates seamlessly with Django’s ORM. In the previous Item
example, the Item
model is a Django model, and the ItemViewSet
uses the ORM to interact with the database:
from .models import Item
from .serializers import ItemSerializer
from rest_framework.viewsets import ModelViewSet
class ItemViewSet(ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
Both FastAPI and Django REST Framework are powerful tools for building RESTful APIs in Python. FastAPI is a great choice when you need high - performance and want to take advantage of asynchronous programming. It is also suitable for microservices and projects where you want to have more control over the API implementation. On the other hand, Django REST Framework is ideal for projects that are already using Django or require seamless integration with Django’s ecosystem. It provides a high - level of abstraction and a lot of built - in functionality out of the box.