web-dev-qa-db-fra.com

Flask dit "n'a pas fourni la variable d'environnement FLASK_APP"

J'essaie d'exécuter une application Flask avec flask run mais quoi qu'il arrive, je reçois cette erreur:

Error: Could not locate Flask application. You did not provide the FLASK_APP environment variable.

J'utilise virtualenv dans mon projet et j'exécute l'application sur le port 80, donc j'exécute la commande en tant que superutilisateur. En fin de compte, j'ai juste besoin d'utiliser le flask db init comme décrit dans Flask-Migrate docs , mais flask doit être capable de trouver l'application pour ce faire. Voici ce que j'ai essayé, sans succès:

Exportation du FLASK_APP variable d'environnement, en veillant à ce qu'elle soit dans mon profil bash, puis en activant virtualenv

$ export FLASK_APP=run.py
$ printenv FLASK_APP
run.py
$ . env/bin/activate
(env) $ Sudo flask run
Error: Could not locate Flask application. You did not provide the     FLASK_APP environment variable.

Activer virtualenv, puis exporter FLASK_APP

$ . env/bin/activate
(env) $ export FLASK_APP=run.py
(env) $ printenv FLASK_APP
run.py
(env) Sudo flask run
Error: Could not locate Flask application. You did not provide the     FLASK_APP environment variable.

Les deux ci-dessus avec le chemin complet, /Users/me/code/project/run.py

$ printenv FLASK_APP
/Users/me/code/project/run.py

Structure du projet

myproject/
    ├──app/
    |  ├── __init__.py
    |  ├── models.py
    |  ├── templates/
    |  └── views.py
    ├── tests/
    ├── run.py
    ├── requirements.txt
    └── config.py

Jusqu'à présent, rien n'a fonctionné et le message d'erreur est le même dans chaque cas. Que puis-je faire pour corriger cette erreur?

8
rosendin

Quand je laisse tomber Sudo de Sudo flask run, Flask trouve $FLASK_APP. Cependant, j'obtiens le message d'erreur socket.error: [Errno 13] Permission denied. Je ne vois pas de solution, car Flask ne peut pas trouver $FLASK_APP quand je cours en tant que superutilisateur. On dirait une logique circulaire.

J'ai réussi à exécuter Flask en changeant le port de 80 en 5000 et en supprimant Sudo avec flask run. C'est très bien, je devrai trouver un moyen d'exécuter l'application sur le port 80 en production.

J'ai pu exécuter flask db init après avoir supprimé et recréé ma base de données et supprimé les appels à db.create_all.

Edit - 27/04/17 le port 80 a en effet été bloqué par le pare-feu sur mon serveur (le pare-feu est hors de mon contrôle) donc l'exécution de l'application sur un port ouvert a résolu le problème.

3
rosendin

En supposant que vous appelez app=App(__name__) dans votre fichier init. Essayez ceci, même si techniquement cela devrait aussi fonctionner avec run.py.

export FLASK_APP=app/__init__.py; flask run

Essayez également de faire un echo $FLASK_APP plus tard pour voir si la valeur en fait est stockée dans la variable d'environnement qui flask accède directement et pas seulement au profil bash.

9
oxalorg

Si vous êtes sous Windows, assurez-vous qu'il n'y a pas d'espace autour de l'égal:

set FLASK_APP=app.py

au lieu de

set FLASK_APP = app.py

C'est ce qui m'est arrivé. J'ai eu l'erreur "Vous n'avez pas fourni la variable d'environnement FLASK_APP" à cause des espaces.

0
u2gilles

Sous Powershell, vous devez définir le FLASK_APP variable d'environnement comme suit:

$env:FLASK_APP = "webapp"

Vous devriez alors pouvoir exécuter python -m flask run dans le dossier hello_app. En d'autres termes, PowerShell gère les variables d'environnement différemment, donc la ligne de commande standard set FLASK_APP=webapp ne fonctionnera pas.