python-dotenv 패키지로 개발/배포 환경 분리하기
개발 과정중에 환경변수를 매번 변경해주는 작업은 여간 귀찮은게 아니다.
python-dotenv를 사용하면 개발 환경과 배포 환경의 환경변수를 자동으로 세팅할 수 있다.
간단한 Flask 어플리케이션을 예제를 통해 환경변수를 설정해보자.
개발환경 설정
다음과 같은 파일 구조를 가진 Flask 어플리케에션에 환경 변수를 설정해보자.
.
├── myproject
├── __init__.py
└── function1.py
└── run.py
Flask 어플리케이션이 잘 작동하는지 확인하기 위해 route에 글자를 띄우는 어플리케이션을 만들어보자.
# myproject/__init__.py
from flask import Flask
def app():
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>MY PROJECT!</h1>'
return app
환경변수 설정이 완료되면 다음과 같이 .flaskenv .env settings.py 3개의 설정 파일이 추가된다.
.
├── myproject
├── __init__.py
├── function.py
└── settings.py
├── run.py
├── .env
└── .flaskenv
python-dotenv 설치
$ pip install flask python-dotenv
.flaskenv 설정
#.flaskenv
FLASK_APP=myproject # default: app
FLASK_ENV=development
DEBUG = True
FLASK_RUN_PROT = 5000
FLASK_ENV가 development, production 일때 return 되는 글자를 다르게 설정하면 .flaskevn가 잘 적용되는지 확인 할 수 있다.
# myproject/__init__.py
from flask import Flask
def app():
app = Flask(__name__)
@app.route('/')
def index():
if app.config['ENV'] == 'production':
return '<h1>MY PROJECT!</h1>'
else:
return '<h1>DEV: MY PROJECT!</h1>'
return app
1) FLASK_ENV=production
2) FLASK_ENV=development
.env 설정
#.env
SECRET_KEY=yoursecretkey
DATA_BASE=yourdatabase
settings.py 설정
# myproject/settings.py
import os
SECRET_KEY = os.environ.get('SECRET_KEY')
__init__.py 수정
# myproject/__init__.py
from flask import Flask
from .settings import *
def app():
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DATA_BASE
app.secret_key = SECRET_KEY
@app.route('/')
def index():
if app.config['ENV'] == 'production':
return '<h1>MY PROJECT!</h1>'
else:
return '<h1>DEV: MY PROJECT!</h1>'
return app
.env 파일은 flask 명령어나 run()을 호출할 때만 로드된다.
지금처럼 run.py로 어플리케이션을 실행할 때( uwsgi를 사용한 운영 환경 포함)
.env 파일을 로드하고 싶다면 load_dotenv()를 사용해서 수동으로 호출해야 한다.
# myproject/settings.py
import os
from dotenv import load_dotenv
load_dotenv('.env')
SECRET_KEY = os.environ.get('SECRET_KEY')
배포(uWSGI)환경 설정
앞서 언급했듯이 uWSGI를 사용하는 배포환경에서는 .flaskenv가 로드되지 않는다.
그렇다면 uWSGI 환경의 테스트 서버에 development 모드로 배포 하고 싶을 떄는 어떻게 해야 할까?
이런 경우에는 uwsgi 설정파일(myproject.ini )에서 env를 설정할 수 있다.
uWSGI 설정에 대한 자세한 내용은 아래의 글에서 확인 할 수 있다.
# myproject.ini
[uwsgi]
module = run:app
master = true
processes = 5
socket = myproject.socket # unix socket
chmod-socket = 660
vacuum = true
die-on-term = true
env = MY_FLASK=development # 환경변수 설정
<참고>
- https://prettyprinted.com/tutorials/automatically_load_environment_variables_in_flask
'# Development > Flask' 카테고리의 다른 글
[Flask] Slack Bot 으로 서비스 장애 알림 받기 (0) | 2023.03.14 |
---|---|
[Flask] Flask에서 Express MiddleWare 사용하기 (0) | 2023.02.15 |
[Flask] CORS (Cross-Origin Resource Sharing) 설정 (0) | 2023.01.19 |