Flask says "did not provide the FLASK_APP environment variable" - flask

I'm trying to run a Flask application with flask run but no matter what, I receive this error:
Error: Could not locate Flask application. You did not provide the FLASK_APP environment variable.
I'm using virtualenv in my project and I'm running the app on port 80 so I run the command as superuser. Ultimately, I just need to use the flask db init command as described in Flask-Migrate's docs, but flask needs to be able to find the app to do that. Here's what I've tried, with no success:
Exporting the FLASK_APP environment variable, ensuring that it's in my bash profile, then activating 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.
Activating virtualenv, then exporting 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.
The above two with the full path, /Users/me/code/project/run.py
$ printenv FLASK_APP
/Users/me/code/project/run.py
Project Structure
myproject/
├──app/
| ├── __init__.py
| ├── models.py
| ├── templates/
| └── views.py
├── tests/
├── run.py
├── requirements.txt
└── config.py
So far nothing has worked and the error message is the same in each case. What can I do to fix this error?

If you are on Windows, make sure there is no space around the equal :
set FLASK_APP=app.py
instead of
set FLASK_APP = app.py
That's what happened to me. I got the " You did not provide the FLASK_APP environment variable" error because of the spaces.

Assuming you call app=App(__name__) in your init file. Try this, even though technically it should work with run.py as-well.
export FLASK_APP=app/__init__.py; flask run
Also try doing an echo $FLASK_APP later to see if the value actually gets stored in the environment variable which flask directly accesses and not only the bash profile.

Under Powershell, you have to set the FLASK_APP environment variable as follows:
$env:FLASK_APP = "webapp"
Then you should be able to run python -m flask run inside the hello_app folder. In other words, PowerShell manages environment variables differently, so the standard command-line set FLASK_APP=webapp won't work.

When I drop sudo from sudo flask run, Flask finds $FLASK_APP. However, I get the error message socket.error: [Errno 13] Permission denied. I can't see a way around this, as Flask cannot find $FLASK_APP when I run as superuser. Seems like circular logic.
I've managed to run Flask by changing the port from 80 to 5000 and dropping sudo with flask run. This is fine, I will have to find a way to run the app on port 80 in production though.
I was able to run flask db init after dropping and recreating my database, and removing calls to db.create_all.
Edit - 4/27/17 port 80 was indeed blocked by the firewall on my server (the firewall is beyond my control) so running the app on an open port resolved the issue.

looks you are using bash shell in your terminal. read the flask 2.0 docs. the command should be export FLASK_APP=run and it will have no extension

I faced the same issue. I am using Python 3.10 in VS code.
C:\Users\hansr>flask --version
Python 3.10.1
Flask 2.0.3
Werkzeug 2.0.3
USING set FLASK_APP='main.py' did not work for me and throws the same mentioned error above.
TRY:
$env:FLASK_APP = "main"
python -m flask run
REFERENCE

I am using python3 on Windows and was getting the same error message as the original poster. Here is the code that worked for me:
set FLASK_APP=nameofyourfile.py

Related

Celery in production raise ModuleNotFoundError: No module named 'celery'

In developement all is good, app starts without any problems. However, in production, Gunicorn can't start due ModuleNotFoundError: No module named 'celery'
Celery is installed properly
>>> from celery import Celery
>>> print(Celery)
<class 'celery.app.base.Celery'>
already tried changing file name to anything other than celery.py - did not help
Any thoughts?
Here are a few things you can try to resolve the issue:
Check if the Python version used in production matches the one used in development. If it's different, make sure that Celery is installed for the correct version of Python.
Check if the virtual environment is activated when running the app in production. The virtual environment should contain all the required packages, including Celery.
Check if the Celery module is installed in the correct location. The module should be located in the site-packages directory of the Python environment.
Try to run the command pip show celery in the environment where you are running the app in production. This command will show you the location of the Celery package and the version number. Make sure that it matches the version installed in your development environment.
Try to run your app with the following command: python -c "import celery". This will check if the Celery module can be imported without any issues.

Django app conflicts with an existing Python module

I have a function that generates a bash script file '.sh' to create a django project and a few apps.
This is the bash file I generate:
#! /bin/bash
cd projectx
source projectxenv/Scripts/activate
python manage.py startapp app1
python manage.py startapp app2
deactivate
When I execute the bash I generated, it gives me the following errors:
django.core.management.base.CommandError: 'app1' conflicts with the name of an existing Python module and cannot be used as an app name. Please try another name.
django.core.management.base.CommandError: 'app2' conflicts with the name of an existing Python module and cannot be used as an app name. Please try another name.
I don't think app1 and app2 are existing modules, and also, I tried running these commands manually and they work, but when I try ./bash.sh, it doesn't work.

Run pytest on vagrant ubuntu vm with windows as host. Import file mismatch

I guess that this is a quite specific situation but I will make the question since I didn't found a relevant answer and might be useful to someone else.
The situation is this:
Windows is the host OS.
There is an Ubuntu VirtualBox (created with vagrant).
My django project folder is shared between windows and ubuntu.
I installed pytest (through pytest-django) both on ubuntu and on
my virtualenv on windows.
If I run the pytest command from the windows virtualenv the tests run
just fine
But in the ubuntu vm terminal I can't just run the pytest command
since I get the error: The program 'pytest' is currently not
installed.
I can run it though with python -m pytest. But in this case I get import file mismatch errors:
========================ERRORS =======================
_____________ ERROR collecting my_django_app/tests.py ____________
import file mismatch:
imported module 'my_django_app.tests' has this **__file__** attribute:
C:\virtualEnvs\my_env\project_src\my_django_app\tests.py
which is not the same as the test file we want to collect:
/vagrant/projects/project_src/my_django_app/tests.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
The message is very clear but I don't know how to overcome this issue.
I use python 2.7.9 and there is no pycache folder (nor ant .pyc compiled files).
I just had to delete the cached compiled python files. These files are inside __pycache__ folders inside the django project folder. Each django app has one pycache folder too.
If you run pytest in windows host, the cached compiled files contain the windows specific paths and try to import modules from there. So the cached files must be deleted. Then you can run pytest in the ubuntu VM using the command: python -m pytest
You can avoid the creation of the compiled files in the first place by running the python interpreter with -B option: python -B pytest

manage.py runserver - ImportError: No module named MYSITE

I can't get the dev environment running!
I've been following the instructions here (tutorial on DjangoProject page). When I type
manage.py runserver
I get the following error:
ImportError: No module named MYSITE
I am executing the command within the folder MYSITE which has the files init.py, manage.py, settings.py, urls.py
I've searched around and found questions on "manage.py runserver", but not this specific error. Your help is greatly appreciated. Thanks
If you're using windows, you'll need to put your project's directory (the one with manage.py in it) into an environment variable called PYTHONPATH.
Since this is highly ranked on Google and I got here while searching for an answer I'll share my solution:
I have a project built on my machine, packaged into a debian package and installed on a test machine. On my machine I use the runserver but on the testmachine I use apache (which was using fine). When changing database from sqlite to postgresql I could not do shell or syncdb etc (all manage commands). The problem here was that manage.py was owned by www-data and it had to be root for these commands to work...
sudo chown root. manage.py
Another different answer ;) I'm walking the "Django for the Impatient: Building a Blog" chapter from "Python Web Development with Django" and it suggests creating a "dotted" module so I registered my application as "x.y" which it didn't like. Changing to "y" which matched the file-system as:
/x
+ manage.py
+ /x
+ settings.py
+ /y
+ models.py
Worked for me.

Django not finding apps in virtualenv when using manage.py syncdb

My problem is in getting manage.py syncdb to run within a virtualenv.
It was working fine at one point, but seems to have broken sometime around when I installed South and updated pip and distribute.
Anyways, when the virtualenv is activated, I can import apps fine within the interactive interpreter. Running through mod_wsgi, the apps are imported as well, and the site can run.
When I run manage.py syncdb, it fails to find any app in INSTALLED_APPS that is in my virtualenv. It picks up system-installed apps fine, but fails when it tries to import virtualenv only apps.
Hi This is an old question, but saw its not answered. Not sure what you are attempting to do, but there are basically two modes you can use virtualenv,
For development, to create self-contained environments
For deployment, to create self-contained environments
In the first case, you need to first Activate your virtualenv with source venv/bin/activate, for when you deploy, you need to ensure that the virtualenv is activated for your website code. Personally i prefer the following approach to ensuring your path is set correctly. (I also add this to my manage.py when doing development, so i dont have to worry about activating the environment first.
Modified manage.py
#!/usr/bin/env python
import os.path
# Cater for Virtual env, add to sys.path
pwd = os.path.abspath(os.path.dirname(__file__))
project = os.path.basename(pwd)
new_path = pwd.strip(project)
activate_this = os.path.join(new_path,'venv','bin','activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
from django.core.management import execute_manager
try:
import settings # Assumed to be in the same directory.
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
sys.exit(1)
if __name__ == "__main__":
execute_manager(settings)
This works, due to how i structure my projects, you would have to change it to your directory structure. My projects are structured like so:
TopLevelDir
|
|- Project DIR
|- venv
|- requirements
|- deployment configs
I have a simple solution to this
Just launch manage.py from the python in the bin of your virtual environment.
So say your python is here /home/tom/environments/my_env/bin/python you could launch manage.py like so:
/home/tom/environments/my_env/bin/python manage.py syncdb
then just create a symlink to the virtual environment's python inside your django project and call it env_python then you can do this:
./env_python manage.py syncdb