从另一个烧瓶应用访问使用flask-sqlalchemy创建的数据库

时间:2017-08-24 11:08:57

标签: python flask sqlalchemy flask-sqlalchemy

+-- 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文件(我尽可能地在文档和互联网上的其他地方关注信息)?

1 个答案:

答案 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 应用程序会将 dbapp 实例化为全局变量并将它们导入到其他文件中。我认为我们不应该导入静态变量(常量除外)。我认为更pythonic的方式是导入模块。