Program Tip

Gunicorn에서 실행되는 Flask 앱 디버깅

programtip 2020. 11. 23. 19:56
반응형

Gunicorn에서 실행되는 Flask 앱 디버깅


내 애플리케이션에 nginx / gunicorn 및 Flask를 사용하여 새로운 개발 플랫폼에서 작업하고 있습니다.

Ops-wise, 모든 것이 잘 작동합니다-내가 겪고있는 문제는 Flask 레이어를 디버깅하는 것입니다. 내 코드에 오류가있을 때 브라우저에 곧바로 500 오류가 반환되고 콘솔이나 로그에 아무것도 표시되지 않습니다.

나는 것 같아요 .. 여러 가지 CONFIGS / 옵션을 시도했습니다 있어야합니다 분명 뭔가 빠진합니다.

내 gunicorn.conf :

import os

bind = '127.0.0.1:8002'
workers = 3
backlog = 2048
worker_class = "sync"
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'

일부 Flask 코드의 예 : testserver.py :

from flask import Flask
from flask import render_template_string
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)

@app.route('/')
def index():
    n = 1/0
    return "DIV/0 worked!"

마지막으로 gunicorn에서 플라스크 앱을 실행하는 명령 :

gunicorn -c gunicorn.conf.py testserver:app

감사합니다


수락 솔루션이 작동하지 않습니다.

Gunicorn은 pre-forking 환경이며 Flask 디버거는 forking 환경에서 작동하지 않습니다 .

주의

비록 인터랙티브 디버거가 forking 환경에서 작동하지 않더라도 (프로덕션 서버에서 사용하는 것이 거의 불가능하게 만듭니다) [...]

설정 하더라도을 실행하면 내부 서버 오류app.debug = True 메시지와 함께 빈 페이지 만 표시 됩니다 . gunicorn으로 할 수있는 최선의 방법은 . 그러면 내부 서버 오류 메시지 와 함께 추적이 제공 됩니다. 그러나 이것은 Flask 디버거가 아니라 터미널에 표시되는 것과 동일한 텍스트 추적입니다.gunicorn testserver:appgunicorn --debug testserver:app

if __name__ ...testserver.py에 섹션을 추가하고 python testserver.py개발 중인 서버를 시작하기 위해 실행 하면 Flask 디버거가 제공됩니다. 즉, Flask 디버거를 원한다면 개발에 gunicorn을 사용하지 마십시오.

app = Flask(__name__)
app.config['DEBUG'] = True

if __name__ == '__main__':
    app.run()


Heroku 사용자를위한 팁 :

개인적으로 나는 아직도 사용하려면 foreman start, 대신 python testserver.py이후 나를 위해 모든 ENV 변수를 설정합니다 . 이 작업을 수행하려면 :

내용 Procfile

web: bin/web

bin/web, 파일의 내용은 프로젝트 루트에 상대적입니다.

#!/bin/sh

if [ "$FLASK_ENV" == "development" ]; then
        python app.py
else
        gunicorn app:app -w 3
fi

개발 .env중에 다음 내용으로 프로젝트 루트에 상대적인 파일을 생성합니다 (문서는 여기 ).

FLASK_ENV=development
DEBUG=True

또한 프로덕션의 디버그 모드에서 Flask를 실행하지 않는 app.config['DEBUG']...라인 으로 변경하는 것을 잊지 testserver.py마십시오.

app.config['DEBUG'] = os.environ.get('DEBUG', False)

Flask 구성은 gunicorn과 완전히 별개입니다. 다음 설정 파일에 술병 문서 것은 좋은 솔루션이 내 소스를 변경할 것입니다 :

app = Flask(__name__)
app.config.from_pyfile('config.py')

그리고 config.py에서 :

DEBUG = True

Heroku 사용자 의 경우 Nick이 제안한 것처럼 bin / web 스크립트를 만드는 것보다 더 간단한 솔루션이 있습니다.

Instead of foreman start, just use foreman run python app.py if you want to debug your application in development.


Try setting the debug flag on the run command like so

gunicorn -c gunicorn.conf.py --debug testserver:app

and keep the DEBUG = True in your Flask application. There must be a reason why your debug option is not being applied from the config file but for now the above note should get you going.


I had similiar problem when running flask under gunicorn I didn't see stacktraces in browser (had to look at logs every time). Setting DEBUG, FLASK_DEBUG, or anything mentioned on this page didn't work. Finally I did this:

app = Flask(__name__)
app.config.from_object(settings_map[environment])
if environment == 'development':
    from werkzeug.debug import DebuggedApplication
    app_runtime = DebuggedApplication(app, evalex=False)
else:
    app_runtime = app

Note evalex is disabled because interactive debbugging won't work with forking (gunicorn).

참고URL : https://stackoverflow.com/questions/8950674/debugging-a-flask-app-running-in-gunicorn

반응형