Client -> Gunicorn -> Flask --CRUD--> MySQL
# Description
- Flask를 사용한 간단한 REST API 데모 서버
- SQL 쿼리를 사용한 CRUD 작업
# Language
Python 3.9.18
# Python Package
Flask==2.3.3
mysql-connector-python==8.3.0
gunicorn==21.2.0
# Database
MySQL 8.2.0
-
Install Docker Engine
# Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
# Install Docker Tools sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Manage Docker as a non-root user sudo groupadd docker sudo usermod -aG docker $USER newgrp docker
-
Start MySQL Server
# Setup ENV export DBNAME=<DBNAME> export DBUSER=<USERNAME> export DBPASS=<USERPASSWORD> export DBROOTPASS=<ROOTPASSWORD> # Run MySQL Container docker run -d -p 3306:3306 \ --env MYSQL_DATABASE=$DBNAME \ --env MYSQL_ROOT_PASSWORD=$DBROOTPASS \ --env MYSQL_USER=$DBUSER \ --env MYSQL_PASSWORD=$DBPASS \ hyukjun/mysql-8.2.0-init-scheme-amd64:1.0
-
Start Flask API Server
# Get MySQL Container IP Address export DBHOST=$(docker inspect <CONTAINERID> | grep -wi IPAddress | awk '{gsub("\"",""); gsub(",",""); print $2}' | head -n 1) # Run Flask API Server docker run -d -p 8000:8000 \ --env MYSQL_DATABASE_HOST=$DBHOST \ --env MYSQL_DATABASE_DB=$DBNAME \ --env MYSQL_DATABASE_USER=$DBUSER \ --env MYSQL_DATABASE_PASSWORD=$DBPASS \ hyukjun/flask-rest-api-amd64:1.0 # Call API Server curl localhost:8000/api/player
# Run MySQL Container
# Setup ENV
export DBNAME=<DBNAME>
export DBUSER=<USERNAME>
export DBPASS=<USERPASSWORD>
export DBROOTPASS=<ROOTPASSWORD>
# Run MySQL Container
docker run -d -p 3306:3306 \
--env MYSQL_DATABASE=$DBNAME \
--env MYSQL_ROOT_PASSWORD=$DBROOTPASS \
--env MYSQL_USER=$DBUSER \
--env MYSQL_PASSWORD=$DBPASS \
hyukjun/mysql-8.2.0-init-scheme-amd64:1.0
# python 3.9 설치
brew install [email protected]
# 가상 환경 세팅 (python 3.9)
python3.9 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
# 로컬 구동시 사전에 환경변수 주입 필요
export MYSQL_DATABASE_HOST=
export MYSQL_DATABASE_DB=
export MYSQL_DATABASE_USER=
export MYSQL_DATABASE_PASSWORD=
# 로컬 구동
python main.py # 디버그 모드
gunicorn -c gunicorn_config.py main:app # 운영 모드
# 빌드 및 실행
docker build -t IMAGE:TAG .
docker run -d -p 8000:8000 \
--env MYSQL_DATABASE_HOST=MYSQL_SERVER_ADDRESS \
--env MYSQL_DATABASE_DB=MYSQL_DB_NAME \
--env MYSQL_DATABASE_USER=MYSQL_USER_NAME \
--env MYSQL_DATABASE_PASSWORD=MYSQL_USER_PASSWD \
IMAGE:TAG
# linux/amd64 아키텍쳐로 빌드
docker build --platform linux/amd64 -t IMAGE:TAG
OS의 세팅된 환경변수 읽어오기
import os
print(os.environ['HOME'])
# Returns `None` if the key doesn't exist
print(os.environ.get('KEY_THAT_MIGHT_EXIST'))
# Returns `default_value` if the key doesn't exist
print(os.environ.get('KEY_THAT_MIGHT_EXIST', default_value))
# Returns `default_value` if the key doesn't exist
print(os.getenv('KEY_THAT_MIGHT_EXIST', default_value))
Flask의 request 메소드로 데이터 읽어오기
# query parameter
request.args.get('parameter')
# data from raw data
request.get_data()
# data from form data
request.form.get('value')
gunicorn 구동 방법
# start server
gunicorn --config gunicorn_config.py MODULE:INSTANCE