Github Link - https://github.com/paullee714/flask-projects/tree/develop/flask-smart-structure
pipenv
를 사용하면 pip freeze
으로 남겨주었던 requirements.txt
를 남기지 않고도 pipfile
으로 자동으로 남는다. 너무 편하다.
$ pip3 install pipenv # 설치가 되어있지 않다면! $ pipenv shell # <-- 가상환경을 자동으로 만들어주고, 실행시켜준다. (가상환경이름) $ pipenv install [package_name] # <-- 가상환경 내에 설치
설치를 하면, 같은 경로 내의 Pipfile로 저장이 된다.
내가 설치한 명령어와 Pipfile이다
(가상환경이름) $ pipenv install flask flask-script python-dotenv
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] flask = "*" flask-script = "*" python-dotenv = "*" [dev-packages] autopep8 = "*" [requires] python_version = "3.9"
. ├── Pipfile ├── Pipfile.lock ├── README.md ├── app │ └── __init__.py ├── config │ ├── __init__.py │ └── flask_config.py ├── manage.py ├── model │ ├── __init__.py │ └── test_model.py ├── provider │ ├── __init__.py │ ├── common_provider.py │ ├── first │ │ ├── __init__.py │ │ └── first_provider.py │ └── second │ ├── __init__.py │ └── second_provider.py └── router ├── __init__.py ├── first_router │ ├── __init__.py │ └── first.py └── second_router ├── __init__.py └── second.py
.env(dot-env)
로 환경을 파악 해서 production과 develop 환경을 구분 해 준다.from flask import Flask, jsonify from config import flask_config from router import first_router def register_router(flask_app: Flask): # router들을 등록 해주는 곳 from router.first_router.first import first from router.second_router.second import second flask_app.register_blueprint(first) flask_app.register_blueprint(second) # flask app의 request/response들과 매번 함께 실행 할 함수 정의 @flask_app.before_request def before_my_request(): print("before my request") @flask_app.after_request def after_my_request(res): print("after my request", res.status_code) return res def create_app(): # 앱 설정 app = Flask(__name__) app.config.from_object((get_flask_env())) register_router(app) return app def get_flask_env(): # 환경변수에 따라 config나누기 if(flask_config.Config.ENV == "prod"): return 'config.flask_config.prodConfig' elif (flask_config.Config.ENV == "dev"): return 'config.flask_config.devConfig'
말 그대로 “before_request” 와 “after_request” 이다.
from flask_script import Server, Manager from app import create_app app = create_app() manager = Manager(app) manager.add_command( "runserver", Server(host='0.0.0.0', port=5000, use_debugger=True) ) if __name__ == "__main__": manager.run()
import os from dotenv import load_dotenv load_dotenv(verbose=True) class Config(object): ENV = os.getenv('ENV') CSRF_ENABLED = True SECRET_KEY = os.getenv('SECRET_KEY') SQLALCHEMY_TRACK_MODIFICATIONS = False class devConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = "mysql+pymysql://" + os.environ["DB_USERNAME"] + ":" \ + os.environ["DB_PASSWORD"] + "@" \ + os.environ["DB_HOST"] + ":" \ + os.environ["DB_PORT"] + "/" \ + os.environ["DB_DATABASE"] class prodConfig(Config): DEBUG = False SQLALCHEMY_DATABASE_URI = "mysql+pymysql://" + os.environ["DB_USERNAME"] + ":" \ + os.environ["DB_PASSWORD"] + "@" \ + os.environ["DB_HOST"] + ":" \ + os.environ["DB_PORT"] + "/" \ + os.environ["DB_DATABASE"]
from flask import jsonify, request, Blueprint first = Blueprint('first_route', __name__) @first.route("/first", methods=['GET']) def first_route(): msg = { "page": "first", "method": "GET" } return jsonify(msg)
절대 아니다. 프로젝트에 따라서 자유롭게 적용 하면 좋을 것 같다.
내가 이렇게 하면 좋겠다~ 해서 작성한 구조가 절대 정답이 아니다. 그냥 정리를 좋아한다.
좀더 컴팩트하게 정리하고 싶은 생각이든다…!!!!!!