2017-06-04 56 views
1

我已經燒瓶中的應用程序的結構,如下所示:如何不使用__init__.py作爲Flask應用程序名稱?

  • repo_root
    • config.py
    • requirements.txt
    • my_cool_app/
    • my_cool_app/__ init__.py
    • my_cool_app/models.py
    • my_cool_app/views.py
    • my_cool_app /靜態/
    • my_cool_app /模板/

而且my_cool_app的內容/ __ init__.py樣子:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from flask_migrate import Migrate 
from flask_oauth2_login import GoogleLogin 
from flask_login import LoginManager 

app = Flask(__name__) 
app.config.from_object('config') 
db = SQLAlchemy(app) 
migrate = Migrate(app, db) 

google_login = GoogleLogin(app) 
login_manager = LoginManager() 
login_manager.init_app(app) 

import my_cool_app.models 
import my_cool_app.views 

要運行它,我調用:

FLASK_APP=my_cool_app/__init__.py flask run 

基於各種在線文檔,我認爲我應該能夠將FLASK_APP設置爲包名my_cool_app。當我這樣做,並調用flask run,應用程序啓動,但在瀏覽器中我立刻看到錯誤:

flask.cli.NoAppException 
flask.cli.NoAppException: The file/path provided (my_cool_app) does not appear to exist. Please verify the path is correct. If app is not on PYTHONPATH, ensure the extension is .py 

我應該怎麼做才能夠設置FLASK_APP只是my_cool_app?或者,對於FLASK_APP被設置爲其他內容,是否更合適/典型?

+0

執行導出時,你在什麼目錄下FLASK_APP = my_cool_app燒瓶運行?你在你的repo_root目錄嗎? – clockwatcher

+0

一般來說'__init __。py'是放置程序包所需的代碼的好地方。這不是放置應用程序代碼的地方。 –

回答

1

基礎的在關於this issue的討論中,看起來確實可以設置FLASK_APP=my_cool_app並且與python -m flask run成功運行。還不確定這是如何影響生產配置的。

+1

這樣做會導致警告/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py:125:RuntimeWarning:'flask.cli'在導入包'flask'後在sys.modules中找到,但在執行'燒瓶之前。CLI';這可能會導致不可預知的行爲 – ybakos

+1

添加問題https://github.com/pallets/flask/issues/2357 – ybakos

0

它看起來像你的my_cool_app模塊沒有得到你的Python路徑。如果不是,你需要設置你的PYTHONPATH變量。

假設你在repo_root目錄是執行你的命令時,你應該能夠使用:

FLASK_APP=my_cool_app PYTHONPATH=. flask run 

如果你想從任何地方運行它,然後:

FLASK_APP=my_cool_app PYTHONPATH=/path/to/repo flask run 
+0

謝謝。但是,如果可能的話,我想避免更改PYTHONPATH,以堅持更好的做法。見https://github.com/pallets/flask/issues/1847 – ybakos

+0

似乎'python -m flask run'可能是要走的路。 – ybakos