flask - NameError:未定义名称'app'

And*_*y K 6 python flask

我正在通过下面的脚本运行Flask(run.py)

#!flask/bin/python
from app import app
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

运行脚本时,我有这个回溯

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
Run Code Online (Sandbox Code Playgroud)

我试图添加from app import app到models.py和models.py但它不起作用.

我究竟做错了什么?

我的__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
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

lap*_*ira 9

您在导入之前使用该应用程序,此处为lm.init_app(app),尚未定义应用程序.

它应该如下所示:

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
Run Code Online (Sandbox Code Playgroud)

  • @AndyK,你需要将`app = Flask(__ name __)`行移到任何使用`app`的行上方(例如`lm.init_app(app)`).你不需要添加`来自app import app`. (2认同)

Vir*_*oop 8

出现此错误是因为您没有定义应用而是直接使用应用

解决方案是在您的代码中添加以下行:app Flask(__ name__)

示例: 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)
Run Code Online (Sandbox Code Playgroud)