티스토리 뷰
Fast Api 설치
pip install fastapi
터미널에 위의 명령어를 입력하면 설치가 됩니다.
추가로 Python이 없을 경우 따로 설치해야 합니다.
pip install "uvicorn[standrad]"
서버 작동을 위해서 uvicorn도 설치를 합니다.
uvicorn main:app --reload
설치가 완료된 후 위의 명령어를 입력하면
http://127.0.0.1:8000의 주소로 서버가 구동된 것을 확인할 수 있습니다.
하지만 아직 아무것도 안 했기 때문에
{"detail":"Not Found"} 이런 문구가 출력이 될 것입니다.
이제 Python 파일을 생성해 줍니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def main():
return "개인 서버 생성"
이렇게 작성하고 다시 http://127.0.0.1:8000 주소에 들어가 보면
“개인 서버 생성"이라는 문구가 출력이 됩니다.
만들고자 하는 Api의 목적에 맞게 get, put, post 등을 사용할 수 있습니다.
또한 http://localhost:8000/docs 다음의 주소로 접속하게 되면
위와 같은 화면이 나오게 됩니다.
Fast Api에서 만든 Api들이 자동으로 Swagger로 생성이 되어 테스트를 진행할 수 있습니다.
데이터베이스 생성 및 연결
데이터베이스 종류는 여러 가지가 있지만 저는 MySQL을 사용하였습니다.
데이터베이스 생성 시 Hostname과 Username, password를 기록해둡니다.
그다음 원하는 스키마를 만들고 역시 스키마 명을 기록해둡니다.
그다음 스키마 안에 원하는 테이블을 만들면 됩니다.
우선 이렇게 데이터베이스를 준비가 완료되었습니다.
pip install sqlalchemy
Python에서 sql을 다루기 위하여 sqlalchemy를 설치해 줍니다.
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
user_name = "root"
user_pwd = "----"
db_host = "127.0.0.1"
db_name = "pokemonDB"
DATABASE = 'mysql+pymysql://%s:%s@%s/%s?charset=utf8' % (
user_name,
user_pwd,
db_host,
db_name,
)
ENGINE = create_engine(
DATABASE,
encoding="utf-8",
echo=True
)
session = scoped_session(
sessionmaker(
autocommit=False,
autoflush=False,
bind=ENGINE
)
)
Base = declarative_base()
Base.query = session.query_property()
user_name, user_pwd, db_host, db_name은 위에서 기록해 둔 값들을 입력해 주면 됩니다.
아래의 내용은 데이터베이스와 연결을 진행하고 설정을 진행하는 과정입니다.
여기서 만든 session을 이용하여 데이터베이스를 조회, 쿼리 등 관리를 하게 됩니다.
여기까지 작업을 진행하면 데이터베이스와 연결은 완료가 되었습니다.
그다음은 Python에서 다룰 수 있도록 Model을 생성해 주어야 합니다.
예시로 저는 Pokemon 테이블을 위와 같이 정의하였습니다.
from sqlalchemy import Column, Integer, String
from pydantic import BaseModel
from db import Base
from db import ENGINE
from typing import List
class PokemonTable(Base):
__tablename__ = 'pokemon'
index = Column(Integer, primary_key=True, autoincrement=True)
number = Column(String(45))
name = Column(String(45))
status = Column(String(45))
classification = Column(String(45))
characteristic = Column(String(45))
attribute = Column(String(45))
dotImage = Column(String(500))
dotShinyImage = Column(String(500))
image = Column(String(500))
shinyImage = Column(String(500))
description = Column(String(500))
generation = Column(Integer)
class Pokemon(BaseModel):
index : int = None
number: str = None
name : str = None
status : str = None
classification : str = None
characteristic : str = None
attribute : str = None
dotImage : str = None
dotShinyImage : str = None
image : str = None
shinyImage : str = None
description : str = None
generation : int = None
class PokemonTable(Base)에서는 __tablename__을 테이블명과 동일하게 입력하고
해당하는 값에 맞게 Column의 속성을 입력해 줍니다.
이 클래스의 경우 데이터베이스 조회, 쿼리 등에 사용하게 됩니다.
class Pokemon(BaseModel)은 Row 데이터를 저장하는 용도로 사용됩니다.
이런 식으로 사용하는 테이블에 관한 클래스를 생성해 나가면 됩니다.
데이터베이스를 활용하여 API 만들기
예시로 간단하게 전체 조회와 데이터 입력을 만들어보겠습니다.
1) 전체 조회
@app.get("/pokemons")
async def read_pokemons():
pokemons = session.query(PokemonTable).all()
return pokemons
기본적인 전체 조회 방법입니다.
async 명령어를 통해 비동기로 조회가 가능합니다.
[
{
"number": "0001",
"status": "45,49,49,65,65,45",
"index": 1,
"characteristic": "심록,엽록소",
"dotImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/1.gif>",
"dotShinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/shiny/1.gif>",
"shinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/home/shiny/1.png>",
"generation": 1,
"name": "이상해씨",
"classification": "씨앗포켓몬",
"attribute": "풀,독",
"image": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/home/1.png>",
"description": "태어나서부터 얼마 동안은 등의 씨앗으로부터 영양을 공급받아 크게 성장한다."
},
{
"number": "0002",
"status": "60,62,63,80,80,60",
"index": 2,
"characteristic": "심록,엽록소",
"dotImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/2.gif>",
"dotShinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/shiny/2.gif>",
"shinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/home/shiny/2.png>",
"generation": 1,
"name": "이상해풀",
"classification": "씨앗포켓몬",
"attribute": "풀,독",
"image": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/home/2.png>",
"description": "등의 봉오리가 부풀어 오르면 달콤한 냄새가 감돌기 시작한다. 큰 꽃이 필 조짐이다."
},
...
]
http://127.0.0.1:8000/pokemons 주소를 입력하면 위와 같이 모든 정보가 나오는 것을 확인할 수 있습니다.
@app.get("/pokemons")
async def read_pokemons():
pokemons = session.query(PokemonTable.number, PokemonTable.name, PokemonTable.dotImage, PokemonTable.dotShinyImage).all()
return pokemons
특정 Column만 출력하기 위해서는 위와 같이 원하는 값을 넣어주면 됩니다.
[
{
"number": "0001",
"name": "이상해씨",
"dotImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/1.gif>",
"dotShinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/shiny/1.gif>"
},
{
"number": "0002",
"name": "이상해풀",
"dotImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/2.gif>",
"dotShinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/shiny/2.gif>"
},
{
"number": "0003",
"name": "이상해꽃",
"dotImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/3.gif>",
"dotShinyImage": "<https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/animated/shiny/3.gif>"
},
...
]
그러면 위와 같이 데이터가 변경된 것을 확인할 수 있습니다.
2) 데이터 등록
@app.post("/pokemon")
async def create_pokemon(item: Pokemon):
pokemon = PokemonTable()
pokemon.number = item.number
pokemon.name = item.name
pokemon.status = item.status
pokemon.classification = item.classification
pokemon.characteristic = item.characteristic
pokemon.attribute = item.attribute
pokemon.dotImage = item.dotImage
pokemon.dotShinyImage = item.dotShinyImage
pokemon.image = item.image
pokemon.shinyImage = item.shinyImage
pokemon.description = item.description
pokemon.generation = item.generation
session.add(pokemon)
session.commit()
return f"{item.name} 추가 완료"
코드 양은 조금 긴데 내용은 Pokemon(BaseModel class)를 post를 통해 받아온 뒤
PokemonTable(base class)에 매핑을 합니다.
데이터베이스의 insert문에 해당하는 add를 통해 값을 저장하고
commit을 통해 값을 반영하게 됩니다.
이렇게 Fast Api 사용법에 대해 간략하게 알아보았습니다.
좀 더 다양한 쿼리 조건은 다음 글에서 소개하겠습니다.
'안드로이드 > 코드' 카테고리의 다른 글
포켓몬 도감 만들기(3) : Fast Api, Compose, 상세 화면 (0) | 2022.08.21 |
---|---|
포켓몬 도감 만들기(2) : Fast Api, Compose, 홈 화면, 리스트 화면 (0) | 2022.08.21 |
Compose로 메모장 만들기 (0) | 2022.08.01 |
Compose 미니 프로젝트 : Pokedex (0) | 2022.06.30 |
Compose 기초 2 : Text, Image, LazyColumn + Card (0) | 2022.06.30 |
- Total
- Today
- Yesterday
- Compose 네이버 지도
- 안드로이드
- 웹뷰
- Android Compose
- Android
- compose
- Compose ConstraintLayout
- Row
- Gradient
- WebView
- Kotlin
- Compose 네이버 지도 api
- Compose ModalBottomSheetLayout
- Compose BottomSheetDialog
- column
- Worker
- Duplicate class found error
- LazyColumn
- Compose QRCode Scanner
- Compose Naver Map
- Pokedex
- WorkManager
- Compose BottomSheetScaffold
- 포켓몬 도감
- Fast api
- Retrofit
- Duplicate class fond 에러
- Compose MotionLayout
- 안드로이드 구글 지도
- Compose BottomSheet
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |