본문 바로가기

# Development/Flask

[Flask] python-dotenv로 개발/배포 환경 분리하기

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')
 

Command Line Interface — Flask Documentation (2.1.x)

Command Line Interface Installing Flask installs the flask script, a Click command line interface, in your virtualenv. Executed from the terminal, this script gives access to built-in, extension, and application-defined commands. The --help option will giv

flask.palletsprojects.com

 

 

배포(uWSGI)환경 설정

앞서 언급했듯이 uWSGI를 사용하는 배포환경에서는 .flaskenv가 로드되지 않는다.

그렇다면  uWSGI 환경의 테스트 서버에 development 모드로 배포 하고 싶을 떄는 어떻게 해야 할까? 

 

이런 경우에는 uwsgi 설정파일(myproject.ini )에서 env를 설정할 수 있다.

 

uWSGI 설정에 대한 자세한 내용은 아래의 글에서 확인 할 수 있다.

 

[Nginx] ubuntu 환경에서 Flask 배포하기 (Git, uWSGI, Socket)

ubuntu 환경에서 Flask 배포하기 (Git, uWSGI, Nginx) 사전준비 패키지 매니징 툴 apt(Advance Packging Tools) 업데이트 $ sudo apt update Git에서 소스코드 다운로드 1. Git 설치 $ sudo apt install git 2. Git 초기화 프로젝

yoon001.tistory.com

# 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