프로젝트를 생성 -> vscode로 연다.
gokuma
|_ myvenv
$ python -m venv {가상환경 이름}
mac/linux 의 경우 : $ source {가상환경 이름}/bin/activate
window의 경우 : $ source {가상환경 이름}/Scripts/activate
$ deactivate
gokuma
|_ myvenv
|_ back(flask project)
.... |_ app.py
.... |_ config.py
.... |_ db_connect.py
.... |_ models.py
.... |_ requirements.txt
$ pip install flask # flask 설치
$ pip install flask-migrate # migration
$ pip install flask-cors # cors
requirements.txt 생성
$ pip freeze > requirements.txt
app.py
from flask import Flask
from flask_migrate import Migrate
from models import User
from db_connect import db
from api.user import user
def create_app(test_config=None):
app = Flask(__name__)
app.config.from_object('config')
app.register_blueprint(user)
return app
app = create_app()
db.init_app(app)
migrate = Migrate(app, db)
@app.route('/')
def welcome():
message = "Gokuma is the best!"
return message
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')
config.py
# ORM
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:password@db/Gokuma'
SQLALCHEMY_TRACK_MODIFICATIONS=False
# etc config
SECRET_KEY=b'\x0c\xe6\xe8\x86\xc5\xec\xfb\xfd\xb7\x9cN=\x10M\x0fg'
JSON_AS_ASCII = False
db_connect.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_app(app):
db.init_app(app)
models.py
from db_connect import db
class User(db.Model):
__tablename__ = "User"
id = db.Column(db.Integer, nullable=False,
primary_key=True, autoincrement=True)
name = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(255), nullable=False)
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
flask db init
flask db migrate
flask db upgrade
flask db downgrade
gokuma
|_ myvenv
|_ back(flask project)
.... |_ api
.... .... |_ user.py
.... |_ app.py
.... |_ config.py
.... |_ db_connect.py
.... |_ models.py
.... |_ requirements.txt
api > user.py
from flask import Blueprint, request, session, jsonify
from werkzeug.security import check_password_hash
from werkzeug.security import generate_password_hash
import re
from models import User
from db_connect import db
user = Blueprint("user", __name__, url_prefix="/api/user")
@user.route('/temp')
def testUserApi():
if request.method == 'GET':
gokuma = User.query.filter(User.name == 'gokuma').first()
return str(gokuma.name)
Dockerfile
FROM python:3
WORKDIR /app
ENV FLASK_APP=app.py
ENV FLASK_ENV=development
COPY ./requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
$ npm install -g create-react-app
$ create-react-app front
$ npm run build
$ npm install axios
$ npm install react-router-dom
$ npm install http-proxy-middleware # back api 사용하기 위해서
Dockerfile
FROM node:14-slim
WORKDIR /usr/src/app
COPY ./package.json ./
COPY ./package-lock.json ./
RUN npm install
COPY . .
EXPOSE 80 # azure 배포를 위해서 80포트로 맞춰주기(기본 react는 3000)
CMD ["npm", "start"]
package.json
"scripts": {
"start": "export PORT=80 && react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
front > src > setupProxy
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = (app) => {
// /api 포함 route에 대해서는 "http://back:5000"을 domain으로 하여 proxy설정
app.use(
'/api',
createProxyMiddleware({
target: 'http://back:5000',
changeOrigin: true,
}))
}
gokuma
|_ myvenv
|_ db
.... |_ Dockerfile
.... |_ initdb.sql
.... |_ utf8.cnf
Dockerfile
FROM mysql:8
COPY utf8.cnf /etc/mysql/conf.d/
COPY initdb.sql /docker-entrypoint-initdb.d/
initdb.sql
CREATE DATABASE IF NOT EXISTS Gokuma;
utf8.cnf
[client]
default-character-set = utf8
[mysqld]
init_connect = SET collation_connection = utf8_general_ci
init_connect = SET NAMES utf8
character-set-server = utf8
collation-server = utf8_general_ci
skip-character-set-client-handshake
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
docker-compose.yml
version: '3'
services:
db:
build:
context: ./db
dockerfile: ./Dockerfile
environment:
MYSQL_ROOT_PASSWORD: "password"
MYSQL_DATABASE: Gokuma
command:
- --character-set-server=utf8
- --collation-server=utf8_unicode_ci
restart: always
back:
depends_on:
- db
build: ./back
ports:
- "5000:5000"
volumes:
- ./back:/app
environment:
FLASK_ENV: development
front:
build: ./front
ports:
- "80:80"
volumes:
- ./front:/usr/src/app
depends_on:
- back
다중 컨테이너 application을 정의하고 공유할 수 있도록 개발된 도구이다. compose에서 서비스를 정의하는 yaml 파일(docker-compose.yml)을 만들고, 단일 명령을 사용하여 모두 실행하거나 모두 종료할 수 있다.
$ git clone https://kdt-gitlab.elice.io/ai_track/class_03/ai_project/team6/gokuma.git
$ cd gokuma
$ cd front && npm install && cd ..
$ docker-compose up -d
$ docker exec -it gokuma-back-1 /bin/bash
또는
$ docker exec -it gokuma-back-1 //bin//bash
# flask db upgrade
# exit
$ docker-compose down
$ docker rmi gokuma_front gokuma_back gokuma_db
$ docker exec -it gokuma-back-1 /bin/bash
또는
$ docker exec -it gokuma-back-1 //bin//bash
$ flask db upgrade
$ flask db downgrade
위 명령어 한번 실행에 바로 직전 migration 하나가 취소됩니다.
$ docker exec -it gokuma-db-1 /bin/bash
또는
$ docker exec -it gokuma-db-1 //bin//bash
mysql -u root -p
password 입력(back > config에서 확인)$ docker-compose -f docker-compose.prod.yml up -d