├── api.py ├── app.py ├── database.py ├── db.sqlite ├── deps.py ├── models.py ├── schemas.py └── todos.py /api.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter 2 | from apis import todos 3 | 4 | 5 | api_router = APIRouter() 6 | api_router.include_router(todos.router, prefix="/todos", tags=["todos"]) -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI 2 | from api import api_router 3 | from starlette.templating import Jinja2Templates 4 | 5 | from sqlalchemy.orm import Session 6 | from database import engine 7 | import models 8 | 9 | models.Base.metadata.create_all(bind=engine) 10 | 11 | templates = Jinja2Templates(directory="templates") 12 | 13 | app = FastAPI() 14 | 15 | app.include_router(api_router) 16 | -------------------------------------------------------------------------------- /database.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine 2 | from sqlalchemy.orm import sessionmaker 3 | from sqlalchemy.ext.declarative import declarative_base 4 | 5 | DB_URL = "sqlite:///./db.sqlite" 6 | 7 | engine = create_engine(DB_URL, connect_args = { "check_same_thread": False }) 8 | 9 | SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) 10 | 11 | Base = declarative_base() -------------------------------------------------------------------------------- /db.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Abdul-Basit-Ansari/Todo-List-Fastapi/f3d46291b3822a84bdca86162c9c3d038ff0ddbc/db.sqlite -------------------------------------------------------------------------------- /deps.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | from database import SessionLocal, engine 4 | 5 | # Dependency 6 | def get_db(): 7 | db = SessionLocal() 8 | try: 9 | yield db 10 | finally: 11 | db.close() 12 | -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | from email.policy import default 2 | from sqlalchemy import Boolean, Column, Integer, String 3 | from database import Base 4 | 5 | class Todo(Base): 6 | __tablename__ = "todos" 7 | 8 | id = Column(Integer, primary_key=True) 9 | title = Column(String(100)) 10 | complete = Column(Boolean, default=False) -------------------------------------------------------------------------------- /schemas.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel , constr 2 | 3 | class TodoBase(BaseModel): 4 | title: constr(strip_whitespace=True) 5 | complete: bool = False 6 | class Config: 7 | orm_mode = True 8 | 9 | class TodoCreate(TodoBase): 10 | pass 11 | 12 | class TodoUpdate(TodoBase): 13 | pass -------------------------------------------------------------------------------- /todos.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI, Depends, Request, Form, status , APIRouter 2 | from starlette.responses import RedirectResponse 3 | from deps import get_db 4 | from sqlalchemy.orm import Session 5 | from schemas import TodoCreate , TodoUpdate 6 | import models 7 | 8 | router = APIRouter() 9 | 10 | @router.get("/") 11 | async def get_todos(db: Session = Depends(get_db)): 12 | todos = db.query(models.Todo).all() 13 | return todos 14 | 15 | @router.post("/todo" ,response_model=TodoCreate) 16 | def add_todo(todo : TodoCreate , db: Session = Depends(get_db)): 17 | new_todo = models.Todo(title=todo.title , complete = todo.complete) 18 | try: 19 | db.add(new_todo) 20 | db.commit() 21 | db.refresh(new_todo) 22 | return new_todo 23 | except Exception as err: 24 | return err 25 | @router.patch("/todo/{todo_id}" ,response_model=TodoUpdate) 26 | def update_todo(todo_id: int,update_todo : TodoUpdate , db: Session = Depends(get_db)): 27 | todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first() 28 | todo.title = update_todo.title 29 | todo.complete = update_todo.complete 30 | db.commit() 31 | return todo 32 | 33 | 34 | @router.delete("/delete/{todo_id}") 35 | def delete_todo(todo_id: int, db: Session = Depends(get_db)): 36 | todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first() 37 | db.delete(todo) 38 | db.commit() 39 | return f"{todo.id} Id Is Deleted" 40 | 41 | --------------------------------------------------------------------------------