Python/Fast API

Python(13)- Pycharm으로 FastAPI, Streamlit 사용하기

두설날 2024. 6. 4. 09:47

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

줄바꿈 설정: Editor > General > Soft Wraps > Soft-wrap these files  ON 설정


파이썬 프레임워크

1. Django

Django는 "The web framework for perfectionists with deadlines"라는 슬로건을 가지고 있는 강력한 풀스택 웹 프레임워크입니다. 주로 대규모 웹 애플리케이션을 구축하는 데 사용됩니다.

  • 특징:
    • 배터리 포함: Django는 ORM, 인증, 관리자 인터페이스, 폼 처리, 유효성 검사 등 대부분의 기능을 내장하고 있습니다.
    • MTV 패턴: Model-Template-View 패턴을 사용하여 구조적인 코드 작성을 지원합니다.
    • 데이터베이스 지원: 다양한 데이터베이스를 지원하며 ORM을 통해 데이터베이스 작업을 쉽게 할 수 있습니다.
    • 생산성: 많은 기능이 내장되어 있어 빠르게 개발할 수 있습니다.
  • 장점:
    • 풍부한 기능과 확장성
    • 강력한 커뮤니티와 풍부한 문서
    • 내장된 관리자 인터페이스로 빠른 관리 기능 제공
  • 단점:
    • 높은 러닝 커브
    • 초기 설정과 구성에 시간이 많이 소요될 수 있음
    • 무거운 프레임워크로 작은 프로젝트에는 과할 수 있음

2. Flask

Flask는 "A microframework for Python based on Werkzeug, Jinja2, and good intentions"이라는 슬로건을 가지고 있는 마이크로 프레임워크입니다.

  • 특징:
    • 경량: 최소한의 기능만 포함하고 있으며, 필요한 기능은 확장을 통해 추가합니다.
    • 유연성: 개발자가 원하는 대로 구조를 설계할 수 있습니다.
    • 단순성: 빠른 설정과 간단한 코드로 작은 프로젝트에 적합합니다.
  • 장점:
    • 가벼움과 유연성
    • 단순하고 빠른 설정
    • 작은 프로젝트와 마이크로서비스에 적합
    • 주로 데모용으로 사용
  • 단점:
    • 기본적으로 제공되는 기능이 거의 없음
    • 확장 기능을 선택하고 구성해야 하는 번거로움
    • 대규모 프로젝트에는 적합하지 않을 수 있음

3. FastAPI

FastAPI는 최신 웹 프레임워크로, 주로 API를 빠르고 효율적으로 구축하는 데 사용됩니다. 비동기 프로그래밍과 타입 힌팅을 활용하여 고성능과 코드 안정성을 제공합니다.

  • 특징:
    • 비동기 지원: 비동기 기능을 기본적으로 지원하여 높은 성능을 제공합니다.
    • 타입 힌팅: Python의 타입 힌트를 활용하여 코드의 가독성을 높이고, 자동 데이터 검증 및 변환을 제공합니다.
    • 자동 문서화: OpenAPI와 JSON Schema를 사용하여 Swagger UI와 ReDoc을 통한 자동 문서화를 제공합니다.
    • 의존성 주입: 강력한 의존성 주입 시스템으로 모듈화와 재사용성을 높입니다.
  • 장점:
    • 높은 성능 (비동기 지원 덕분에)
    • 타입 힌팅을 통한 자동 데이터 검증 및 변환
    • 자동화된 문서화
    • 최소한의 설정과 빠른 개발 속도
  • 단점:
    • Django만큼 많은 기능이 내장되어 있지 않음
    • 커뮤니티와 생태계가 Django만큼 크지 않음

fastAPI사이트 : https://fastapi.tiangolo.com/ko/

 

FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

※  타입 힌팅(Type Hints)

타입 힌팅(Type Hints)은 프로그래밍 언어에서 변수, 함수 매개변수, 함수 반환값 등에 대한 데이터 타입 정보를 코드에 명시적으로 제공하는 기술입니다. Python 3.5 이상에서 도입된 기능으로, 코드의 가독성을 높이고 프로그램의 안정성을 강화하는 데 도움이 됩니다.

fastAPI 설치하기

파이썬 interpreter 설정

패키지 모듈 상태
fastapi 설치확인

 


4. Swagger

Swagger UI는 OpenAPI (이전의 Swagger) 사양을 기반으로 작성된 RESTful 웹 서비스를 시각적으로 표현하고 테스트할 수 있는 도구입니다. 핵심 기능은 다음과 같습니다:

  • API 문서화: API의 구조와 사용법을 자동으로 문서화하여 개발자에게 제공.
  • 인터랙티브 테스트: API 엔드포인트를 쉽게 테스트하고 응답을 확인할 수 있는 인터페이스 제공.
  • 실시간 업데이트: OpenAPI 스펙 파일의 변경사항을 즉시 반영하여 최신 문서와 테스트 환경 유지.

FastAPI는 자동으로 생성된 Swagger UI를 통해 API 문서를 제공합니다. 기본적으로 http://127.0.0.1:8000/docs 또는 http://127.0.0.1:8000/redoc에서 확인할 수 있습니다. Swagger UI를 통해 API의 엔드포인트, 매개변수, 응답 형식 등을 살펴볼 수 있습니다.

# 다음 명령을 사용하여 uvicorn을 통해 실행할 수 있습니다.
uvicorn main:app --reload

# pip install fastapi
from fastapi import FastAPI
# 클래스를 모두 json변환 시켜주는 모듈
from pydantic import BaseModel
app = FastAPI()

users = {
    0 : {'userid': 'apple', 'name': '김사과'},
    1 : {'userid': 'banana', 'name': '반하나'},
    2 : {'userid': 'orange', 'name': '오렌지'},
    3 : {'userid': 'cherry', 'name': '체리'}
}
# 데코레이터 : 함수 감싸기
# http://127.0.0.1:8000/
@app.get('/')
async def root():
    return {'message': 'hello FastAPI!'}

# http://127.0.0.1:8000/users/1
# 변수타입 어노테이션
@app.get('/users/{id}')
async def find_user(id: int):
    user = users[id]
    return user

# http://127.0.0.1:8000/users/1/userid
# http://127.0.0.1:8000/users/1/name
# userid와 name을 모두 key:str(매개변수)로 처리
@app.get('/users/{id}/{key}')
async def find_user_by_key(id: int, key:str):
    user = users[id][key]
    return user

http://127.0.0.1:8000/users/3
http://127.0.0.1:8000/users/3/userid
http://127.0.0.1:8000/users/3/name

class User(BaseModel):
    userid: str
    name: str

# http://127.0.0.1:8000/users/10
@app.post('/users/{id}')
async def create_user(id: int, user: User):
    if id in users:
        return {'error': '이미 존재하는 키'}
    users[id] = user.__dict__
    return {'success': 'ok'}

fastAPI를 활용한 get, post테스트

주소뒤에 /docs 입력

# 수정
@app.put('/users/{id}')
# id를 입력받아 id가 존재하지 않으면 에러
# userid가 존재하면 userid를 변경
# name이 존재하면 name을 변경
async def update_user(id: int, user: UserForUpdate):
    if id not in users:
        return {"error": "id가 존재하지 않음"}
    if user.userid:
        users[id]['userid'] = user.userid
    if user.name:
        users[id]['name'] = user.name
    return {"success": "ok"}

# 삭제
@app.delete('/users/{id}')
# id를 입력받아 id가 존재하면 삭제
def delete_item(id: int):
    users.pop(id)
    return {"success": "ok"}


5. Streamlit

- 파이썬으로 데이터 분석을 위한 웹앱 등을 쉽게 개발할 수 있게 도와주는 라이브러리
- 간단한 코드로 웹 애플리케이션을 만들고 빠르게 프로토타입을 구추갛고 시각적으로 공유하기 위해 사용
- gradio, volia, binder 등과 유사
https://streamlit.io/

 

Streamlit • A faster way to build and share data apps

Streamlit is an open-source Python framework for data scientists and AI/ML engineers to deliver interactive data apps – in only a few lines of code.

streamlit.io

설치
    pip install streamlit

설치 확인 및 데모 확인
    streamlit hello

실험
    streamlit run app.by

import streamlit as st

st.title('안녕하세요 streamlit!')
st.write('안녕하세요. 여기는 텍스트 구간입니다.')

'''
# 여기는 제목
## 여기는 작은 제목
- 첫번째
- 두번째
- 세번째
'''

# 텍스트 입력상자
text = st.text_input('문자입력')
st.write(text)

# 체크박스
selected = st.checkbox('개인정보 사용에 동의하시겠습니까?')
if selected:
    st.success('동의했습니다!')

# selectbox
market = st.selectbox('시장', ('코스닥', '코스피', '나스닥'))
st.write(f'선택한 시장: {market}')

# multiSelect
option = st.multiselect('종목', ['카카오', '네이버', '삼성', 'LG전자'])
st.write(','.join(option))

st.metric(label='카카오', value='30,000원', delta='-5000원')
st.metric(label='네이버', value='550,000원', delta='+350,000원')