且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在 Flask 和其他应用程序之间共享 sqlalchemy 模型

更新时间:2022-12-22 12:11:03

与大多数 Flask 扩展一样,Flask-SQLAlchemy 扩展应该在工厂外创建,然后在工厂中使用 init_app 进行初始化.这样您就可以在创建应用程序之前使用 db 对象.

The Flask-SQLAlchemy extension, like most Flask extensions, should be created outside the factory, then initialized in the factory using init_app. This is so that you can use the db object before an app is created.

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    return app

您的 Flask 应用程序,就像任何设计合理的 Python 项目一样,应该是一个可安装的包.这很简单:确保您的项目布局合理,然后添加一个基本的 setup.py 文件.

Your Flask app, like any properly designed Python project, should be an installable package. This is simple to do: make sure your project layout makes sense, then add a basic setup.py file.

project/
    my_flask_package/
        __init__.py  # at the most basic, this contains create_app and db
    setup.py

from setuptools import setup, find_packages

setup(
    name='my_flask_package',
    version='1.0',
    packages=find_packages(),
    install_requires=['flask', 'flask-sqlalchemy'],
)

$ python setup.py sdist

现在您可以安装 Flask 应用程序及其数据库,以便在其他项目中使用.在您的第二个项目的 virtualenv 中安装并导入它,然后创建并推送一个应用程序以对其进行初始化.

Now you can install your Flask app, along with it's database, for use in other projects. Install and import it in your second project's virtualenv, then create and push an app to initialize it.

$ pip install my_flask_package-1.0.tar.gz

from my_flask_package import db, create_app
create_app().app_context().push()
db.session.query(...)

如果您担心创建应用程序所涉及的开销,您可以向 create_app 函数添加参数以控制初始化的内容.不过,在大多数情况下,这应该不是问题.

If you're concerned about overhead involved in creating your application, you could add arguments to the create_app function to control what gets initialized. For most cases this shouldn't be an issue though.