forked from orbit-oss/flask
Import app from wsgi.py or app.py if FLASK_APP is not defined
Fixes #2376
This commit is contained in:
parent
d625d41104
commit
7c40aa9e50
4 changed files with 48 additions and 10 deletions
29
flask/cli.py
29
flask/cli.py
|
|
@ -172,11 +172,12 @@ def prepare_exec_for_file(filename):
|
|||
if not os.path.isfile(os.path.join(dirpath, '__init__.py')):
|
||||
break
|
||||
|
||||
sys.path.insert(0, dirpath)
|
||||
if sys.path[0] != dirpath:
|
||||
sys.path.insert(0, dirpath)
|
||||
return '.'.join(module[::-1])
|
||||
|
||||
|
||||
def locate_app(script_info, app_id):
|
||||
def locate_app(script_info, app_id, raise_if_not_found=True):
|
||||
"""Attempts to locate the application."""
|
||||
__traceback_hide__ = True
|
||||
if ':' in app_id:
|
||||
|
|
@ -193,12 +194,14 @@ def locate_app(script_info, app_id):
|
|||
if sys.exc_info()[-1].tb_next:
|
||||
stack_trace = traceback.format_exc()
|
||||
raise NoAppException('There was an error trying to import'
|
||||
' the app (%s):\n%s' % (module, stack_trace))
|
||||
else:
|
||||
' the app (%s):\n%s' % (module, stack_trace))
|
||||
elif raise_if_not_found:
|
||||
raise NoAppException('The file/path provided (%s) does not appear'
|
||||
' to exist. Please verify the path is '
|
||||
'correct. If app is not on PYTHONPATH, '
|
||||
'ensure the extension is .py' % module)
|
||||
else:
|
||||
return
|
||||
|
||||
mod = sys.modules[module]
|
||||
if app_obj is None:
|
||||
|
|
@ -326,15 +329,23 @@ class ScriptInfo(object):
|
|||
if self.create_app is not None:
|
||||
rv = call_factory(self.create_app, self)
|
||||
else:
|
||||
if not self.app_import_path:
|
||||
if self.app_import_path:
|
||||
rv = locate_app(self, self.app_import_path)
|
||||
else:
|
||||
for module in ['wsgi.py', 'app.py']:
|
||||
import_path = prepare_exec_for_file(module)
|
||||
rv = locate_app(self, import_path,
|
||||
raise_if_not_found=False)
|
||||
if rv:
|
||||
break
|
||||
if not rv:
|
||||
raise NoAppException(
|
||||
'Could not locate Flask application. You did not provide '
|
||||
'the FLASK_APP environment variable.\n\nFor more '
|
||||
'information see '
|
||||
'the FLASK_APP environment variable, and a wsgi.py or '
|
||||
'app.py module was not found in the current directory.\n\n'
|
||||
'For more information see '
|
||||
'http://flask.pocoo.org/docs/latest/quickstart/')
|
||||
|
||||
rv = locate_app(self, self.app_import_path)
|
||||
|
||||
debug = get_debug_flag()
|
||||
|
||||
if debug is not None:
|
||||
|
|
|
|||
6
tests/test_apps/helloworld/hello.py
Normal file
6
tests/test_apps/helloworld/hello.py
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
from flask import Flask
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route("/")
|
||||
def hello():
|
||||
return "Hello World!"
|
||||
1
tests/test_apps/helloworld/wsgi.py
Normal file
1
tests/test_apps/helloworld/wsgi.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
from hello import app
|
||||
|
|
@ -181,6 +181,8 @@ def test_locate_app(test_apps):
|
|||
script_info, "cliapp.factory:create_app ()")
|
||||
pytest.raises(
|
||||
NoAppException, locate_app, script_info, "cliapp.importerrorapp")
|
||||
assert locate_app(script_info, "notanpp.py",
|
||||
raise_if_not_found=False) is None
|
||||
|
||||
|
||||
def test_find_default_import_path(test_apps, monkeypatch, tmpdir):
|
||||
|
|
@ -214,7 +216,7 @@ def test_get_version(test_apps, capsys):
|
|||
assert py_ver in out
|
||||
|
||||
|
||||
def test_scriptinfo(test_apps):
|
||||
def test_scriptinfo(test_apps, monkeypatch):
|
||||
"""Test of ScriptInfo."""
|
||||
obj = ScriptInfo(app_import_path="cliapp.app:testapp")
|
||||
assert obj.load_app().name == "testapp"
|
||||
|
|
@ -228,6 +230,24 @@ def test_scriptinfo(test_apps):
|
|||
assert app.name == "createapp"
|
||||
assert obj.load_app() == app
|
||||
|
||||
obj = ScriptInfo()
|
||||
pytest.raises(
|
||||
NoAppException, obj.load_app)
|
||||
|
||||
# import app from wsgi.py in current directory
|
||||
monkeypatch.chdir(os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), 'test_apps', 'helloworld')))
|
||||
obj = ScriptInfo()
|
||||
app = obj.load_app()
|
||||
assert app.name == 'hello'
|
||||
|
||||
# import app from app.py in current directory
|
||||
monkeypatch.chdir(os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), 'test_apps', 'cliapp')))
|
||||
obj = ScriptInfo()
|
||||
app = obj.load_app()
|
||||
assert app.name == 'testapp'
|
||||
|
||||
|
||||
def test_with_appcontext(runner):
|
||||
"""Test of with_appcontext."""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue