Flask - app.debug=True,python manage.py和export FLASK_DEBUG=True,flask run的不同。


TL;DR,可以直接看下面的總結

問題1:為什么app.config['DEBUG'] = True,然后flask run並沒有開啟debugger和reloading,而直接運行腳本(python manage.py)卻可以生效?

# manage.py
from flask import Flask

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

@app.route('/')
def index():
    return 'hello'

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

然后

export FLASK_APP=manage.py
flask run 

可以看到, 在代碼配置app.debug=True,然后在命令行輸入flask run 並沒有起效。
但是

python manage.py

debugger 和 reloading卻可以生效。

參考

1. https://github.com/pallets/flask/issues/1641

2. https://github.com/pallets/flask/issues/1979

解決

  1. 可以由上面看出,命令行命令flask run 和 直接運行腳本python manage.py是分開的。export FLASK_DEBUG=True是對於服務器的(明確知道開啟了服務器),而寫在代碼里的app.debug=True是對應app(並不知道有沒有加載,代碼有沒有運行)。
  2. 在代碼中寫app.debug = True / app.config['DEBUG'] = True后,使用python manage.py才會生效。
  3. 要想在命令行中有debugger和reloading功能,要export FLASK_DEBUG = True。

注意

在Flask 1.0版本后,新增了FLASK_ENV:http://flask.pocoo.org/docs/1.0/config/#environment-and-debug-features

Setting FLASK_ENV to development will enable debug mode. flask run will use the interactive debugger and reloader by default in debug mode.
但是同樣地,只適用於命令行,在代碼里hardcode然后運行python manage.py是不生效的。

That is

from flask import Flask

app = Flask(__name__)
app.config['ENV']= 'development'

@app.route('/')
def index():
    return 'hello'

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

然后

python manage.py


環境變成了development,但是沒有debugger和reloading。

如果想直接運行腳本python manage.py就有debugger和reloading,

from flask import Flask

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

@app.route('/')
def index():
    return 'hello'

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

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return 'hello'

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

export FLASK_APP=manage.py
export FLASK_ENV='development'
flask run


卻可以生效

問題2:app.config['ENV']= 'development'為啥直接運行腳本(python x.py)不帶有debugger和reloading。

http://flask.pocoo.org/docs/1.0/api/#flask.Flask.env

This maps to the ENV config key. This is set by the FLASK_ENV environment variable and may not behave as expected if set in code.

總結

1. flask run 和 python manage.py 是分開的兩個環境。(export FLASK_DEBUG=True,flask run是對於服務器的(因為設置的是服務器的環境變量),而寫在代碼里的app.debug=True,python manage.py是對應app的(並不知道有沒有加載,代碼有沒有運行)。)在manage.py里面寫,無論是app.debug = True還是app.env = 'development'后,使用flask run 后不會帶有debugger和reloading功能。

if __name__ == '__main__':
    app.run(port=9999)
這是對於python manage.py映射到9999端口,而flask run 不受影響,默認是5000端口。

2. 要想在命令行flask run 后有以上兩個功能,最好是export FLASK_DEBUG = True。或者export FLASK_ENV=developement后將環境變成了development,同時帶有debugger和reloading功能。

3. 要想在代碼里配置,app.config['DEBUG']=True,app.config['ENV']='development',結合使用。然后python manage.py。如果只寫前者,命令行顯示的environment是production。

4. export 環境變量這種是建議的,寫在文件里是不建議的。

Using the environment variables as described above is recommended. While it is possible to set ENV and DEBUG in your config or code, this is strongly discouraged. They can’t be read early by the flask command, and some systems or extensions may have already configured themselves based on a previous value.

5. http://flask.pocoo.org/docs/1.0/server/#in-code

6. 結合4和5, flask run是推薦的做法,python manage.py 是不推薦的做法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM