-
-
Notifications
You must be signed in to change notification settings - Fork 318
[bug] dynaconf init fails with AttributeError: 'Config' object has no attribute 'current_env' if Flask app is detected #705
Description
Hi, everyone. I ran into this problem trying to get started with Dynaconf by running dynaconf init inside an existing Flask project. I was able to reproduce with just a very minimal Flask app in a clean virtualenv (see below).
Upon closer inspection, I see the documentation recommends using the FlaskDynaconf extension. I'm not sure if the "bug" is in the documentation—that is, that the docs should simply say do not run dynaconf init for a Flask project—or in the the dynaconf CLI itself, but it seems like dynaconf init should just work, even if a Flask project is detected.
Anyway, thanks for your consideration, and thanks for all your hard work on Dynaconf.
Describe the bug
dynaconf init yields the following error message if FLASK_APP is set.
$ dynaconf init -f ini
Flask app detected
⚙️ Configuring your Dynaconf environment
------------------------------------------
Traceback (most recent call last):
File "/path/to/dynaconf/venv/bin/dynaconf", line 8, in <module>
sys.exit(main())
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/vendor/click/core.py", line 221, in __call__
def __call__(A,*B,**C):return A.main(*B,**C)
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/vendor/click/core.py", line 205, in main
H=E.invoke(F)
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/vendor/click/core.py", line 345, in invoke
with C:return F(C.command.invoke(C))
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/vendor/click/core.py", line 288, in invoke
if A.callback is not _A:return ctx.invoke(A.callback,**ctx.params)
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/vendor/click/core.py", line 170, in invoke
with G:return A(*B,**E)
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/vendor/click/decorators.py", line 21, in A
def A(*A,**B):return f(get_current_context(),*A,**B)
File "/path/to/dynaconf/venv/lib/python3.7/site-packages/dynaconf/cli.py", line 298, in init
env = settings.current_env.lower()
AttributeError: 'Config' object has no attribute 'current_env'
To Reproduce
Steps to reproduce the behavior:
-
create a Flask
appfactory.pylike sofrom flask import Flask, Blueprint blueprint = Blueprint('default', __name__) @blueprint.route('/') def index(): return 'Default route.' def create_app(): app = Flask(__name__) app.register_blueprint(blueprint) return app
-
set
FLASK_APP=appfactory:create_appin the environment -
run
dynaconf init; fails with the traceback and error message shown above -
unset FLASK_APPand trydynaconf initagain; works
Environment (please complete the following information):
- macOS 10.15.7
- Python 3.7.12 from MacPorts
- Flask 2.0.2 and Dynaconf 3.1.7 from PyPI, in a fresh virtualenv
Other remarks
It doesn't seem to matter if the Flask app uses the application factory pattern or not. With an app.py like this
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Default route.'and FLASK_APP=app.py, I get the same traceback when I run dynaconf init.