learning flask and new to web dev here ,
made the directories as below .
in folder named website and in a subfoder named templates make a file init_.py and outside the website folder ,main.py is there
code in init.py
from flask import Flask
def create_app():
app = Flask(__name__)
app.config['SECRET_KEY']='madkrish'
return app
code in main.py
from website import create_app
app = create_app()
if __name__== '__main__':
app.run(debug=True)
When i run the main function the following errors comes:
No Module named 'website'
given above
Can someone please correct me where i am wrong i need to go further in the tutorial to the next step.
From your folder structure, you need to import from templates, so:
from templates import create_app
It should works.
VSCode will still marks it as error, you need to configure it to inlcude your templates folder in the Python Path
Related
I've followed different tutorials to learn flask, and lately I've been trying do build something more substantial. I run my flask app with flask run. I have a app.py but no __init__.py. FLASK_APP is not set. I understand that because there's no FLASK_APP, flask looks for app.py by default. Here's the entirety of app.py:
from flask import Flask, redirect, url_for
from os import getenv
from dotenv import load_dotenv
from extensions import db, mail
from projects import por
from requests import requests
load_dotenv()
app = Flask(__name__)
def create_app():
print ('IN CREATE APP')
#SQL Alchemy
app.config['SQLALCHEMY_DATABASE_URI'] = getenv('SQLALCHEMY_DATABASE_URI', None)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = getenv('SQLALCHEMY_TRACK_MODIFICATIONS', False)
# WT-Forms
app.config['SECRET_KEY'] = 'Temporary secret key'
app.config['WTF_CSRF_TIME_LIMIT'] = None
#######
db.init_app(app)
mail.init_app(app)
app.register_blueprint(por)
app.register_blueprint(requests)
#app.route('/', methods=['GET'])
def index():
return redirect(url_for('por.por_no_sm'))
# if __name__ == "__main__":
# create_app().run()
I have 3 specific questions:
If I try to start the app with python app.py, I get ModuleNotFoundError: No module named 'flask'. But Flask is installed, and I'm running that in my virtual environment from the same directory as app.py. Why won't it run when I try it that way? Is there any advantage to using flask run rather than python app.py or vice versa?
One of the things I want to do is put the config & setup code inside an app factory. However, when I run with flask run, create_app doesn't run. What's going on there? I can make it run by uncommenting out the last 2 lines & looking for app instead of __main__, but shouldn't it run automatically?
Is there any advantage to adding a root-level __init__.py file? I tried briefly, but then none of the imports at the top of app.py worked. I kept getting a bunch of "No module named extensions", etc. errors. I can fix those by prefacing the names with dots, (e.g., from .extensions import db, mail), but what do I gain by doing that?
Thank you!
If you have a virtual env and you are getting the error ModuleNotFoundError: No module named 'flask', then you have to activate the virtual environment before you can run python app.py
If you're going to use create_app(), then the rest of your code should go under it i.e. app = Flask(__name__) and all of the app variable initializations and your route should go under it. As the name 'create app' says, you are creating the app
i am trying to import create_app from init.py that is located in the website file
but everytime I try to run the code I get
ImportError: cannot import name 'create_app' from 'website' (unknown location)
this is my files
.vscode
env
website
--static
--templates
--__init__.py
--auth.py
--views.py
--models.py
main.py
init.py
from flask import Flask
def create_app():
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hello'
return app
main.py
from website import create_app
app = create_app
if __name__ == '__main__':
app.run(debug=True)
thought this is the only method that isn't working I tried this method to check if the error is from vscode but it is just from this method
I tried
app.py
from flask import Flask
app = Flask(__name__)
#app.route("/")
def home():
return "hello Flask"
and when I write in the terminal `python -m flask run
I would get a website that says "hello Flask"
but when I press the run icon I get nothing
unlike the first one if I run it I would get an import error unknown location
and if I use python -m flask run I would get
Error: could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module not found in the current directory.
thought everything is sync to Github
in both of them I am working in a 'script' environment
A fix I came up with was adding name to the function defining create_app inside the init file.
Example:
from flask import Flask
def create_app(name):
app = Flask(name)
When importing, try from website.templates import create_app. So basically after you put it to import from website, add . following the sub-folder that you desired to import from (in this case it is templates).
I ran into the same thing, but it appears that these files "models, views, etc" isn't in website folder, they are inside static folder which is in website folder, that's why it's not working.
I just fixed them manually.
For someone getting this error later (like myself), be sure to check that your main package's
__init__.py
file is in the correct place.
You forgot create environment variable.
if you using mac or linux export FLASK_APP=main.py
if you windows set FLASK_APP=main.py
And last in main.py should be app = create_app()
try this
in your main.py
from website.init import create_app
or
change file init to init.py
then in your main.py
from website._init_ import create_app
I'm having difficulty getting my flask app to run by using the "python" method. I have no problems using
export FLASK_APP=microblog.py
flask run
but attempting to use
python microblog.py
will result in the following error
ImportError: No module named 'app'
where my microblog.py file looks like this:
from app import app, db
from app.models import User
#app.shell_context_processor
def make_shell_context():
return {'db': db, 'User': User}
and my __init__.py file looks like this:
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
login = LoginManager(app)
login.login_view = 'login'
from app import routes
if __name__ == '__main__':
app.run()
The folder these files reside in is called 'app'. I've tried putting the
if __name__ == '__main__':
app.run()
In the microblog.py file as well, which was also unsuccessful.
I also have folders for templates/static/etc. and a routes file where I run all my #app.route() commands
Again, everything works fine when I run "flask run" in terminal, it just breaks down when I try using "python microblog.py". I'm trying to launch the app on AWS and just about every tutorial requires the applications to be called using the "python" method. Any help is appreciated.
[Solved]
I had my directories mixed up. I pulled microblog.py back outside of the app folder and was able to run python microblog.py with no issues and without having to edit anything.
In hindsight, I probably should have posted the file structure of everything right in the beginning.
In this line from app import app, db you're trying to import a module called app.app, but it apparently does not exists in your project source.
Try to create a file named app.py inside app/ path, copy and paste all content of __init__.py file inside of it.
Your __init__.py must be blank. It's just indicate that your path app/ is a importable module.
See this article.
I have tried this and it worked for me on windows.
$env:FLASK_APP="hello.py"
flask run
That's it
I am just starting up my first Flask project and I am trying to set it up as packages so the app can be broken up. My file structure is:
project/
setup.py
config.py
requirements.txt
.gitignore
appname/
__init__.py
view.py
static/
stylesheets
templates/
html
I have followed a number of tutorials and some have used python setup.py to run the project and others have used flask run. First off, what is the difference?
Now in my init.py the code is:
from flask import Flask, render_template
from appname import views
app = Flask(__name__)
My views.py has:
from appname import app
from flask import render_template
#app.route('/')
def index():
return render_template("index.html")
So far I have been exclusively trying flask run but I get the error:
AppException: The file/path provided (appname) does not appear to exist
If I replace the from appname import views with the views code it works fine. So the issues lies with how I am importing but I feel like I have tried every sort of importing format I know...
Well, the first thing that I see is an infinite loop of imports:
appname imports appname.views, and
appname.views imports appname.
You can break the infinite loop of imports like this: in __init__.py, remove the import of views which is not used:
from flask import Flask
app = Flask(__name__)
To run your application, you must tell Flask where you application is. To do that, you need to export an environment variable, like this:
export FLASK_APP=appname/__init__.py
flask run
* Serving Flask app "appname"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Everything is explained in the Quick start page of the documentation.
Ooops, I forgot your first question: python setup.py is used to run setuptools tasks (like the make command with makefile). It has nothing to do with Flask. See Building and Distributing Packages with Setuptools.
You're trying to import views whereas your module is called view.py see python docs on python packaging
After successfully completing the pythonanywhere flask tutorial (pa.com), Miguel Grinberg's the "Flask Mega Tutorial" (fmt) beckoned. Sadly, I've not even made it to "Hello, World". Here's what I have done:
In pa.com attempting to follow fmt verbatim is a no go:
python3 -m venv flask
leads to an error of
ensurepip is not available
and we do not have sudo access.
Undeterred, I reasoned that all Miguel is asking us to do is distribute the functionality we see in one file in the pa.com tutorial (flask_app.py) into a few files that will make the building of a full app easier. Since pa.com is already setting up my base web app with flask and python 3.4, not being able to set up the virtual env. did not seem to be a block, at least not at first.
Per the fmt, in the base dir of the pa.com (pwd -> home/{username}/microblog) -- which is where the flask_app.py file that successfully generates the pa.com tutorial page lives -- I set up app and tmp directories, and create app/__init__.py, app/views.py and the run.py files as directed by fmt
Hitting the app page (run.py the only file in the main directory) generates an Unhandled Exception on the page.
Changing the name to flask_app.py (which seems to be what pa.com expects on flask installations) generates the same error.
Modifying the content of the flask_app.py code to:
from flask import Flask
app = Flask(__name__)
#app.route('/')
def hello_world():
return "working from flask_app.py"
Generates a successful output from the app, whereas having the same code in a file named run.py generates the same Unhandled Exception error.
the lines:
from app import app in both run.py and views.py and
from app import views in __init__.py
all make me wonder... where is this "app" module coming from? But aside from being puzzled by that question, no other ideas on how to proceed from here. Any suggestions? Would really like to get set up on pa.com and work through this tutorial/book.
Feel like I am missing something basic, but not sure what.
First rule is: don't use app.run() on PythonAnywhere - that's what run.py is trying to do. That's fine for your own PC, but on PA it will cause an error. It's fine to have the file there, but don't try and import from that file in your wsgi config.
Instead, you just need to import the flask app variable, which Miguel gets you to put in app/__init__.py (that's slightly confusing, a variable called app, and a folder called app, but we can deal with it!)
To do that, you'll want to add the folder that contains the app folder to your sys.path. You also need to "rename" the app variable to application as you import it:
# assuming we have /home/myusername/microblog/app/__init__.py:
path = '/home/myusername/microblog'
if path not in sys.path:
sys.path.append(path)
# now we can import the app variable from the app folder's __init__
# and rename it to application
from app import app as application
More info: a brief guide to flask on pythonanywhere and a guide to debugging imports and sys.path problems in your pythonanywhere wsgi file
from microblog import app as application
This is fixed my solution.
Best Regards