?print-pdf
' Created for
https://www.example.com:80/index.html?id=123
#install fastapi
pip install fastapi
# install ASGI server, for production such as Uvicorn:
pip install "uvicorn[standard]"
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from typing import Union
app = FastAPI()
@app.get("/")
async def root():
html_content = "Welcome to my site
"
return HTMLResponse(content=html_content, status_code=200)
@app.get("/items/{item_id}")
def get_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
Run it:
uvicorn main:app --reload
Open your browser at http://127.0.0.1:8000 or http://127.0.0.1:8000/items/5?q=somequery
mkdir simple_todoapp
cd simple_todoapp
# create virtenv:
python -m venv ./.venv
# activate virtualenv:
source ./.venv/bin/activate
# Install FastAPI and Uvicorn for async web serving
pip install fastapi
pip install "uvicorn[standard]"
# Install packages for parsing multipart/form-data and Jinja2 for templates
pip install python-multipart jinja2
# Install SQLAlchemy for database interactions
pip install sqlalchemy
# Install sqlalchemy2-stubs for better type hinting with SQLAlchemy
pip install sqlalchemy2-stubs
|simple_todoapp
└── src
├── app.py
├── db.py
├── models.py
└── templates
└── base.html
mkdir -p simple_todoapp/src/templates
touch simple_todoapp/src/{templates/base.html,app.py,db.py,models.py}
from sqlalchemy import Boolean, Column, Integer, String
from db import Base
class Todo(Base):
__tablename__ = "todos"
id = Column(Integer, primary_key=True)
title = Column(String(100))
complete = Column(Boolean, default=False)
def __init__(self, title: str):
self.title = title
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# Database connection configuration
DB_URL = "sqlite:///./todoapp.db" # SQLite database file path
# Create SQLAlchemy engine for database interaction
engine = create_engine(DB_URL, connect_args={"check_same_thread": False})
# Create a SessionLocal class for managing database sessions
SessionLocal = sessionmaker(
autocommit=False, # Disable autocommit to control transactions manually
autoflush=False, # Disable autoflush to control flushing behavior
bind=engine # Bind the session to the engine
)
# Base class for declarative model definitions
Base = declarative_base()
cd src/
uvicorn app:app --reload
# Navigate to your projects directory
cd path/to/your/projects
# Create a virtual environment named 'venv'
python -m venv venv
# Activate the virtual environment
# On Windows
.\venv\Scripts\activate
# On Unix or MacOS
source venv/bin/activate
pip install Django
# create project structure:
django-admin startproject todo_project
cd todo_project
python manage.py startapp todo_app
python manage.py startapp todo_app
# todo_project/settings.py
INSTALLED_APPS = [
...
'todo_app',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'todoapp.db',
}
}
title
, which is a character field to hold the name or title of the todo item, limited to 100 characters; and complete
, which is a boolean field indicating whether the todo item has been completed, defaulting to False (indicating it's incomplete)
# todo_app/models.py
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=100)
complete = models.BooleanField(default=False)
def __str__(self):
return self.title
python manage.py makemigrations
python manage.py migrate
todo_app/forms.py
and define
#todo_app/forms.py
from django import forms
from .models import Todo
class TodoForm(forms.ModelForm):
class Meta:
model = Todo
fields = ['title']
todo_app/views.py
:
# todo_app/views.py
from django.shortcuts import render
from django.shortcuts import render, redirect
from .models import Todo
from .forms import TodoForm
def home(request):
todos = Todo.objects.all()
form = TodoForm()
if request.method == 'POST':
form = TodoForm(request.POST)
if form.is_valid():
form.save()
return redirect('home')
context = {'todos': todos, 'form': form}
return render(request, 'todo_app/home.html', context)
def update_todo(request, pk):
todo = Todo.objects.get(id=pk)
todo.complete = not todo.complete
todo.save()
return redirect('home')
def delete_todo(request, pk):
todo = Todo.objects.get(id=pk)
todo.delete()
return redirect('home')
todo_app/urls.py
:
# todo_app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('update/<int:pk>/', views.update_todo, name='update_todo'),
path('delete/<int:pk>/', views.delete_todo, name='delete_todo'),
]
# todo_project/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('todo_app.urls')),
]
todo_app/templates/todo_app/home.html
python manage.py runserver
These slides are based on
customised version of
framework