SQLAchemy'找不到应用程序。在视图函数内部工作或按下'

时间:2018-03-03 21:50:39

标签: python-3.x flask flask-sqlalchemy

Ello ello,

我在我面临的问题上找到了类似的问题,并尝试了所提供的解决方案,但它对我不起作用。

我正在尝试将我的模型分离到不同的目录中,并将它们导入app.py

当我尝试将数据库导入python终端时,我发现没有找到应用程序。

app.py代码

from flask import Flask
from flask_restful import Resource, Api
# from flask_sqlalchemy import SQLAlchemy
from routes import test, root, user
from models.todo import db

app = Flask(__name__)
api = Api(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:pass123@localhost/db'
app.config['SECRET_KEY'] = 'thiskeyissecret'
# db.init_app(app)

with app.app_context():
    api = Api(app)
    db.init_app(app)




api.add_resource(root.HelloWorld, '/')
api.add_resource(test.Test, '/test')
api.add_resource(user.User, '/user')

if __name__ == '__main__':
    app.run(debug=True)

模型

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Todo(db.Model):
    __tablename__ = 'Todos'
    id = db.Column('id', db.Integer, primary_key=True)
    data = db.Column('data', db.Unicode)

    def __init__(self, id, data):
        self.id = id
        self.data = data

    def __repr__(self):
        return '<Todo %>' % self.id

我的文件目录看起来像

Main_app

  • 模型
    • Todo.py
  • 路由
    • 一些路线
  • app.py

4 个答案:

答案 0 :(得分:0)

可以在db

中初始化app.py
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
from routes import test, root, user

app = Flask(__name__)
api = Api(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:pass123@localhost/db'
app.config['SECRET_KEY'] = 'thiskeyissecret'
db = SQLAlchemy(app)

api.add_resource(root.HelloWorld, '/')
api.add_resource(test.Test, '/test')
api.add_resource(user.User, '/user')

if __name__ == '__main__':
    app.run(debug=True)

然后在todo.py

from app import db


class Todo(db.Model):
    __tablename__ = 'Todos'
    id = db.Column('id', db.Integer, primary_key=True)
    data = db.Column('data', db.Unicode)

    def __init__(self, id, data):
        self.id = id
        self.data = data

    def __repr__(self):
        return '<Todo %>' % self.id

答案 1 :(得分:0)

我得到同样的错误 可以在viewfunc中操作db的错误原因

def __init__(self, id, data):
        self.id = id
        self.data = data

尝试将代码操作移至您的viewfunc

答案 2 :(得分:0)

Flask-SQLAlchemy需要一个活动的应用程序上下文。

尝试:

with app.app_context():
    print(Todo.query.count())

来自the flask documentation

  

背景的目的

     

Flask应用程序对象具有一些属性,例如config   在视图和CLI命令中访问很有用。但是,导入   您项目中模块内的应用实例易于循环   导入问题。使用应用程序工厂模式或编写可重用时   蓝图或扩展程序,将没有要导入的应用程序实例   全部。

     

Flask通过应用程序上下文解决了此问题。而不是   直接引用应用程序,您可以使用current_app代理,   指向处理当前活动的应用程序。

     

Flask在处理以下内容时会自动推送应用程序上下文   请求。查看函数,错误处理程序和其他正在运行的函数   在请求期间将有权访问current_app。

答案 3 :(得分:0)

简而言之,请执行以下操作:

from yourapp import create_app
app = create_app()
app.app_context().push()