Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

flask - NameError: name 'app' is not defined

Tags:

python

flask

I'm running Flask through thescript, below (run.py)

#!flask/bin/python
from app import app
app.run(debug=True)

When running the script, I have this traceback

File "./run.py", line 2, in <module>
    from app import app
  File "/home/andy.kwok/microblog/app/__init__.py", line 11, in <module>
    lm.init_app(app)
NameError: name 'app' is not defined

I've tried to add from app import app into models.py and models.py but it does not work.

What am I doing wrong?

My __init__.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import os

from flask.ext.login import LoginManager
from flask.ext.openid import OpenID
from config import basedir

lm= LoginManager()
lm.init_app(app)
oid = OpenID(app,os.path.join(basedir,'tmp'))
lm.login_view = 'login'

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)

from app import views, models

My models.py

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    posts = db.relationship('Post', backref='author', lazy='dynamic')

def is_authenticated(self):
    return True

def is_active(self):
    return True

def is_anonymous(self):
    return False


def get_id(self):
    try:
        return unicode(self.id)  # python 2
    except NameError:
        return str(self.id)  # python 3

def __repr__(self):
    return '<User %r>' % (self.nickname)

My views.py

from flask import render_template, flash, redirect, session, url_for, request, g
from flask.ext.login import login_user, logout_user, current_user, login_required
from app import app
from app import db
from app import lm
from app import oid
from .forms import LoginForm
from .models import User

@app.route('/')
@app.route('/index')
@login_required
def index():
    user = g.user
    posts = [
        {
            'author': {'nickname': 'John'},
            'body': 'Beautiful day in Portland!'
        },
        {
            'author': {'nickname': 'Susan'},
            'body': 'The Avengers movie was so cool!'
        }
    ]
    return render_template('index.html',
                           title='Home',
                           user=user,
                           posts=posts)

@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
    if g.user is not None and g.user.is_authenticated():
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        session['remember_me'] = form.remember_me.data
        return oid.try_login(form.openid.data, ask_for=['nickname', 'email'])
    return render_template('login.html',
                           title='Sign In',
                           form=form,
                           providers=app.config['OPENID_PROVIDERS'])



@lm.user_loader
def load_user(id):
    return User.query.get(int(id))

@oid.after_login
def after_login(resp):
    if resp.email is None or resp.email == "":
        flash('Invalid login. Please try again.')
        return redirect(url_for('login'))
    user = User.query.filter_by(email=resp.email).first()
    if user is None:
        nickname = resp.nickname
    if nickname is None or nickname == "":
        nickname = resp.email.split('@')[0]
    user = User(nickname=nickname, email=resp.email)
    db.session.add(user)
    db.session.commit()
    remember_me = False
    if 'remember_me' in session:
        remember_me = session['remember_me']
        session.pop('remember_me', None)
    login_user(user, remember = remember_me)
    return redirect(request.args.get('next') or url_for('index'))

@app.before_request
def before_request():
    g.user= current_user
like image 377
Andy K Avatar asked Mar 26 '15 11:03

Andy K


2 Answers

You are using the app before importing it, here lm.init_app(app), app is not defined yet.

It should look like this:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import os

from flask.ext.login import LoginManager
from flask.ext.openid import OpenID
from config import basedir

app = Flask(__name__)
app.config.from_object('config')

lm= LoginManager()
lm.init_app(app)
oid = OpenID(app,os.path.join(basedir,'tmp'))
lm.login_view = 'login'

db = SQLAlchemy(app)

from app import views, models
like image 128
lapinkoira Avatar answered Oct 20 '22 14:10

lapinkoira


This error is because of you are not defining app and directly using app

Solution is add this line in your code : app Flask(__name__)

Example: app.py

from flask import Flask
#You need to use following line [app Flask(__name__]
app = Flask(__name__)
@app.route('/')
def index():
    return "Hello World with flask"
if __name__ == '__main__':
    app.run(port=5000,debug=True)
like image 33
Viraj Wadate Avatar answered Oct 20 '22 15:10

Viraj Wadate