+-- myproject
¦
+-- api
¦ +-- tests
¦ +-- app
¦ +-- blueprint_1
¦ +-- blueprint_2
¦
+-- data_collector
+-- tests
+-- app
+-- scraper
我使用Flask和flask-sqlalchemy的json api项目结构如上。我计划设置的data_collector应用程序每小时自动运行一次,以抓取网页上发布的最新每小时数据,然后用这些数据填充数据库。我想根据蓝图中指定的查询用来返回json的api应用程序。
到目前为止,我已经能够使用data_collector应用程序填充sqlite数据库,但我只能从这个应用程序中查询数据库,而不是api应用程序。我一直在阅读flask-sqlalchemy docs并在其他地方阅读。首先,我是否有更好的方法来构建我的项目?
我的data_collector应用程序按如下方式实例化数据库:
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
我无法从此文件外部访问数据库或应用程序对象。所以我不能把我的模型放在一个单独的文件中,因为我的模型有db.Models作为基类。从文档中我认为我需要具备以下内容而不是上述内容:
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
db.init_app(app)
return app
我在我的两个应用中都试过这个,但仍然会收到同样的错误:'无法从应用中导入应用'或者'无法从app'导入数据库。我不确定api目录中的应用程序是否需要访问data_collector中的应用程序,因为它是独立的,但我仍然无法访问我创建的sqlite数据库。如何从一个单独的应用程序访问使用data_collector创建的database.db文件(我尽可能地在文档和互联网上的其他地方关注信息)?
答案 0 :(得分:0)
您可以手动将 db
绑定到 app
。
# db.py
from flask_sqlalchemy import SQLAlchemy
def init_app(app):
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
app.db = db
# __init__.py
from flask import Flask
from . import db
def create_app():
app = Flask(__name__)
db.init_app(app)
return app
大多数 Flask 应用程序会将 db
和 app
实例化为全局变量并将它们导入到其他文件中。我认为我们不应该导入静态变量(常量除外)。我认为更pythonic的方式是导入模块。