fastapi-ex1
https://www.youtube.com/watch?v=0CQdCfICAPA
conda install requests
conda install -c conda-forge python-multipart
FastAPI 기초 (1/5) – 개요 및 설치하기
- Swagger : http://127.0.0.1:8000/docs
- ReDoc: http://127.0.0.1:8000/redoc
- openapi: http://127.0.0.1:8000/openapi.json
http://globalintelligence.kr/ >> GNC활동관리 >> Datalab
FastAPI 기초 (2/5) – API구현 (GET, POST, DELETE)
: RESTful을 fastAPI로 구현
예제> Intro to FastAPI – The Best Way to Create APIs in Python?

https://worldtimeapi.org/timezones
import uvicorn
from fastapi import FastAPI
from app.routes import index #auth
def create_app():
app=FastAPI()
app.include_router(index.router)
return app
app = create_app()
# uvicorn main:app --reload
if __name__ == "__main__" :
uvicorn.run("main:app", port=8888, reload=True)
from fastapi import APIRouter
from fastapi import File, UploadFile
import requests
from starlette.requests import Request
from starlette.responses import JSONResponse
from pydantic import BaseModel
import json
#from inspect import currentframe as frame
from datetime import datetime
from dataclasses import asdict
from typing import Optional
router = APIRouter()
db = []
class City(BaseModel):
name:str
timezone:str
@router.get("/")
async def root(req: Request):
"""
`ELB 상태 체크용 API` \
:return:
"""
return JSONResponse( {'hello':'sixxx'} )
@router.get("/cities")
def get_cities():
results = []
for aCity in db:
strs = f"http://worldtimeapi.org/api/timezone/{aCity['timezone']}"
r = requests.get(strs)
cur_time = r.json()['datetime']
results.append(
{'name':aCity['name'],
'timezone':aCity['timezone'],
'current_time':cur_time}
)
return results
...
@router.delete("/cities/{city_id}")
def delete_city(city_id:int):
db.pop(city_id-1)
return {}
FastAPI 기초 (3/5) – 웹CRUD ( GET, POST, PUT, DELETE )
FastAPI 기초 (4/5) – MySQL (MariaDB) 연동 CRUD

Starlette : 경량 ASGI 프레임웤


CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

import uvicorn
from fastapi import FastAPI
from app.routes import dbdb
def create_app():
app=FastAPI()
app.include_router(dbdb.router)
return app
app = create_app()
from starlette.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"]
)
# uvicorn main:app --reload
if __name__ == "__main__" :
uvicorn.run("main:app", port=8888, reload=True)
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, scoped_session user_name = 'enduser' user_pwd = '1234' db_host = 'localhost' db_name = 'edudb' DATABASE = "mysql+pymysql://%s:%s@%s/%s?charset=utf8mb4" %( user_name, user_pwd, db_host, db_name) #DATABASE = "mysql+pymysql://enduser:1234@localhost/edudb?charset=utf8mb4" ENGINE = create_engine( DATABASE, encoding="utf-8", echo=True ) session = scoped_session( sessionmaker( autocommit=False, autoflush=False, bind = ENGINE ) ) # create instance Base = declarative_base() Base.query = session.query_property()
from sqlalchemy import Column, Integer, String from pydantic import BaseModel from database.conn import Base from database.conn import ENGINE class UserTable(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True, autoincrement=True) name= Column(String(50)) # , nullable=False) age = Column(Integer) class User(BaseModel): id : int name : str age : int # SELECT user.id AS user_id, user.name AS user_name, user.age AS user_age # FROM user)
from fastapi import APIRouter
from typing import List
import sys, os
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
#sys.path.append('/Users/onesixx/my/git/hello/app')
from database.conn import session
from database.model import UserTable, User
import requests
from starlette.requests import Request
from starlette.responses import JSONResponse
router = APIRouter()
@router.get("/")
def read_users():
return JSONResponse( {'hello':'sixxx'} )
@router.get("/users")
async def read_users():
users = session.query(UserTable).all()
return users
@router.get("/users/{user_id}")
def read_users(user_id: int):
user= session.query(UserTable).filter(UserTable.id==user_id).first()
return user
@router.post("/users")
def create_users(name:str, age:int):
user= UserTable()
user.name = name
user.age = age
session.add(user)
session.commit()
return f"{name} created."
@router.put("/users")
def update_users(userList: List[User]):
for i in userList:
user = session.query(UserTable).filter(UserTable.id == i.id).first()
user.name= i.name
user.age = i.age
session.commit()
return f"{userList[0].name} updated..."
@router.delete("/users/{user_id}")
def delete_users(user_id: int):
user = session.query(UserTable).filter(UserTable.id == user_id).delete()
session.commit()
return "delete..."
FastAPI 기초 (5/5) – 웹CRUD MySQL(MariaDB) 연동
Web Based Dashboards