Skip to content

[bug] dynaconf init fails with AttributeError: 'Config' object has no attribute 'current_env' if Flask app is detected #705

@ernstki

Description

@ernstki

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:

  1. create a Flask appfactory.py like so

    from 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
  2. set FLASK_APP=appfactory:create_app in the environment

  3. run dynaconf init; fails with the traceback and error message shown above

  4. unset FLASK_APP and try dynaconf init again; 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions