728x90
반응형
pip list vs ls
- pip list : 설치한 라이브러리 리스트
- ls : 디렉토리 리스트
데이터베이스 처리 주요 기능 (CRUD)
Create
Read
Update
Delete
Fast-API : 사용자가 날린 request를 백앤드로 받아서 그에 맞는 response를 보내준다.
미리 만들어져 있는 템플릿을 사용하면 데이터만 바꿔서 넣어 사용할 수 있음!
템플릿에 맞춰서 응답해줌(?)
db와 연결해보기
클래스와 테이블 간의 1-1 매핑
db연결하고 엔진을 식별
=================================================
데이터베이스 연결
pip instal sqlalchemy
앤드포인트함수?
# main.py
import os
from fastapi import FastAPI, Request, Depends, status, Form
from fastapi.responses import RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from database import engine, SessionLocal, Base
from sqlalchemy.orm import Session
import model
import database
app = FastAPI()
# models에 정의한 모든 클래스, 연결한 DB엔진에 테이블로 생성
# model.Base.metadata.create_all(bind=engine)
Base.metadata.create_all(bind=engine)
# 절대경로
abs_path = os.path.dirname(os.path.realpath(__file__))
templates = Jinja2Templates(directory=f"{abs_path}/templates")
# static 폴더(정적파일 폴더)를 app에 연결
# app.mount("/static", StaticFiles(directory=f"static")) # static에 static을 마운트?
app.mount("/static", StaticFiles(directory=f"{abs_path}/static"))
# Dependency Injection(의존성 주입을 위한 함수)
# yield : FastAPI가 함수 실행을 일시 중지하고 DB 세션을 호출자에게 반환하도록 지시
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/")
def home(request: Request, db: Session = Depends(get_db)):
# 데이터베이스에서 모든 할 일 목록을 가져옵니다.
todos = db.query(model.Todo).all()
# index.html 템플릿에 데이터를 전달하여 렌더링합니다.
return templates.TemplateResponse("index.html",
{"request": request,
'datas':todos})
@app.post("/add")
def add(req: Request, title: str = Form(...), db: Session = Depends(get_db)):
# 사용자가 입력한 제목으로 새로운 할 일 객체를 생성합니다.
new_todo = model.Todo(task=title)
# 데이터베이스에 새로운 할 일을 추가합니다.
db.add(new_todo)
db.commit()
# 홈 페이지로 리다이렉션합니다.
url = app.url_path_for("home")
return RedirectResponse(url=url, status_code=status.HTTP_303_SEE_OTHER)
# 할 일 수정
@app.get("/update/{todo_id}")
def update(req: Request, todo_id: int, db: Session = Depends(get_db)):
# 주어진 ID에 해당하는 할 일을 데이터베이스에서 찾아옵니다.
todo = db.query(model.Todo).filter(model.Todo.id == todo_id).first()
# 할 일의 완료 상태를 변경합니다.
todo.completed = not todo.completed
# 변경 내용을 데이터베이스에 반영합니다.
db.commit()
# 홈 페이지로 리다이렉션합니다.
url = app.url_path_for("home")
return RedirectResponse(url=url, status_code=status.HTTP_303_SEE_OTHER)
# 할 일 삭제
@app.get("/delete/{todo_id}")
def delete(todo_id: int, db: Session = Depends(get_db)):
# 주어진 ID에 해당하는 할 일을 데이터베이스에서 찾아옵니다.
todo = db.query(model.Todo).filter(model.Todo.id == todo_id).first()
# 할 일을 데이터베이스에서 삭제합니다.
db.delete(todo)
db.commit()
# 홈 페이지로 리다이렉션합니다.
url = app.url_path_for("home")
return RedirectResponse(url=url, status_code=status.HTTP_303_SEE_OTHER)
# database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 연결 DB 정의
DB_URL = 'sqlite:///todo.sqlite3'
# 데이터베이스에 연결하는 엔진을 생성하는 함수
engine = create_engine(DB_URL, connect_args={'check_same_thread': False})
# 데이터베이스와 상호 작용하는 세션을 생성하는 클래스
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# SQLAlchemy의 선언적 모델링을 위한 기본 클래스
Base = declarative_base()
# model.py
from sqlalchemy import Column, Integer, Boolean, String
from database import Base
class Todo(Base):
__tablename__ = 'todos'
id = Column(Integer, primary_key=True)
task = Column(String(100))
completed = Column(Boolean, default=False)
# app_start.py
import uvicorn
# cli 실행 : uvicorn main:app [--port=8000] --reload
if __name__ == "__main__":
uvicorn.run('main:app',host='localhost', port=7000, reload=True)
{% for todo in datas %} {% endfor %}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Todo App - Fastapi</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
</head>
<body>
<div style="margin-top: 50px;" class="ui container">
<img class="ui centered medium image" src="static/images/todos.png" alt="로고">
<!-- <h1 class="ui center aligned header"></h1> -->
<form class="ui form" action="/add" method="post">
<div class="field">
<label>Todo Title</label>
<input type="text" name="title" placeholder="Enter ToDo task...">
<br>
</div>
<button class="ui blue button" type="submit">Add</button>
</form>
<hr>
{% for todo in datas %}
<div class="ui segment">
<p class="ui big header">{{ todo.id }} | {{ todo.task }}</p>
{% if todo.completed == False %}
<span class="ui gray label">Not Complete</span>
{% else %}
<span class="ui green label">Complete</span>
{% endif %}
<a class="ui blue button" href="/update/{{ todo.id }}">Update</a>
<a class="ui red button" href="/delete/{{ todo.id }}">Delete</a>
</div>
{% endfor %}
</div>
</body>
</html>
* 알게된 점 ! *
해당 함수/라이브러리 위에 커서 놓은뒤 ctrl+. 누르면 라이브러리 import 자동 추천 (vs code 내에 해당)
728x90
반응형
'API' 카테고리의 다른 글
[FastAPI] API 구현 (GET, POST, DELETE) (0) | 2024.10.26 |
---|---|
[HTML + CSS] API 배우기 기본 (5) | 2024.10.08 |
FastAPI (속성 3일차) (0) | 2024.02.03 |
Fast-API (속성 1일차) (2) | 2024.01.31 |