我在我面临的问题上找到了类似的问题,并尝试了所提供的解决方案,但它对我不起作用。
我正在尝试将我的模型分离到不同的目录中,并将它们导入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
答案 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())
背景的目的
Flask应用程序对象具有一些属性,例如config 在视图和CLI命令中访问很有用。但是,导入 您项目中模块内的应用实例易于循环 导入问题。使用应用程序工厂模式或编写可重用时 蓝图或扩展程序,将没有要导入的应用程序实例 全部。
Flask通过应用程序上下文解决了此问题。而不是 直接引用应用程序,您可以使用current_app代理, 指向处理当前活动的应用程序。
Flask在处理以下内容时会自动推送应用程序上下文 请求。查看函数,错误处理程序和其他正在运行的函数 在请求期间将有权访问current_app。
答案 3 :(得分:0)
简而言之,请执行以下操作:
from yourapp import create_app
app = create_app()
app.app_context().push()