Browse Source

Import app from wsgi.py or app.py if FLASK_APP is not defined

Fixes #2376
pull/2378/head
Miguel Grinberg 8 years ago
parent
commit
7c40aa9e50
No known key found for this signature in database
GPG Key ID: 36848B262DF5F06C
  1. 25
      flask/cli.py
  2. 6
      tests/test_apps/helloworld/hello.py
  3. 1
      tests/test_apps/helloworld/wsgi.py
  4. 22
      tests/test_cli.py

25
flask/cli.py

@ -172,11 +172,12 @@ def prepare_exec_for_file(filename):
if not os.path.isfile(os.path.join(dirpath, '__init__.py')): if not os.path.isfile(os.path.join(dirpath, '__init__.py')):
break break
if sys.path[0] != dirpath:
sys.path.insert(0, dirpath) sys.path.insert(0, dirpath)
return '.'.join(module[::-1]) 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.""" """Attempts to locate the application."""
__traceback_hide__ = True __traceback_hide__ = True
if ':' in app_id: if ':' in app_id:
@ -194,11 +195,13 @@ def locate_app(script_info, app_id):
stack_trace = traceback.format_exc() stack_trace = traceback.format_exc()
raise NoAppException('There was an error trying to import' raise NoAppException('There was an error trying to import'
' the app (%s):\n%s' % (module, stack_trace)) ' the app (%s):\n%s' % (module, stack_trace))
else: elif raise_if_not_found:
raise NoAppException('The file/path provided (%s) does not appear' raise NoAppException('The file/path provided (%s) does not appear'
' to exist. Please verify the path is ' ' to exist. Please verify the path is '
'correct. If app is not on PYTHONPATH, ' 'correct. If app is not on PYTHONPATH, '
'ensure the extension is .py' % module) 'ensure the extension is .py' % module)
else:
return
mod = sys.modules[module] mod = sys.modules[module]
if app_obj is None: if app_obj is None:
@ -326,15 +329,23 @@ class ScriptInfo(object):
if self.create_app is not None: if self.create_app is not None:
rv = call_factory(self.create_app, self) rv = call_factory(self.create_app, self)
else: 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( raise NoAppException(
'Could not locate Flask application. You did not provide ' 'Could not locate Flask application. You did not provide '
'the FLASK_APP environment variable.\n\nFor more ' 'the FLASK_APP environment variable, and a wsgi.py or '
'information see ' 'app.py module was not found in the current directory.\n\n'
'For more information see '
'http://flask.pocoo.org/docs/latest/quickstart/') 'http://flask.pocoo.org/docs/latest/quickstart/')
rv = locate_app(self, self.app_import_path)
debug = get_debug_flag() debug = get_debug_flag()
if debug is not None: if debug is not None:

6
tests/test_apps/helloworld/hello.py

@ -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

@ -0,0 +1 @@
from hello import app

22
tests/test_cli.py

@ -181,6 +181,8 @@ def test_locate_app(test_apps):
script_info, "cliapp.factory:create_app ()") script_info, "cliapp.factory:create_app ()")
pytest.raises( pytest.raises(
NoAppException, locate_app, script_info, "cliapp.importerrorapp") 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): 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 assert py_ver in out
def test_scriptinfo(test_apps): def test_scriptinfo(test_apps, monkeypatch):
"""Test of ScriptInfo.""" """Test of ScriptInfo."""
obj = ScriptInfo(app_import_path="cliapp.app:testapp") obj = ScriptInfo(app_import_path="cliapp.app:testapp")
assert obj.load_app().name == "testapp" assert obj.load_app().name == "testapp"
@ -228,6 +230,24 @@ def test_scriptinfo(test_apps):
assert app.name == "createapp" assert app.name == "createapp"
assert obj.load_app() == app 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): def test_with_appcontext(runner):
"""Test of with_appcontext.""" """Test of with_appcontext."""

Loading…
Cancel
Save