5

Flask アプリの一部を引き出して、複数の異なるプロジェクトで使用したいとしましょう。ビューとテンプレートだけでなく、Flask-SQLAlchemy を使用した SQLAlchemy モデルもあります。モジュールを使用して app.route デコレータを取得できますが、SQLAlchemy db オブジェクトをどのように処理できますか?

コンポーネントを分離する必要があるため、db オブジェクトをインポートすることはできません。しかし、db オブジェクトを 2 回作成する必要はないと思います。そのメタデータをプロジェクトの残りのメタデータとどのように混合しますか?

4

2 に答える 2

3

最初にmetadata、flask-sqlalchemy db.Model を再利用可能なアプリのベースとして共有し、使用しないでください。

次に、シグナル、ショートカット、その他のものをサポートするために、flask-sqlalchemy から新しいベースを拡張して、すべてのクラスを再作成する必要があります。

ベースを統合します (バグがある可能性があります):

def integrate_models(cls, nbase):
        new_bases = list(cls.__bases__) + [nbase]
        new_dict = dict(cls.__dict__)
        new_dict.update(dict(nbase.__dict__))
        return type.__new__(cls.__class__, cls.__name__, tuple(new_bases), new_dict)

sqlalchemy 拡張機能を使用した Flask アプリの例:

# -*- coding: utf-8 -*-
from flask import Flask
from flaskext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

if __name__ == '__main__':
        from some_model_base import init_metadata
        init_metadata(db.Model.metadata)

        from some_model import SomeClass

        SomeClass = integrate_models(SomeClass, db.Model)

        db.create_all()

        print SomeClass.query.all()

どこ some_model_base.py:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

def init_metadata(metadata):
    Base.metadata = metadata

そして some_model.py:

from sqlalchemy import Column, Integer, String
from some_model_base import Base

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name =  Column(String(50))

この例では、db.create_all と SomeClass.query のショートカットのみをテストしました。

下手な英語でごめんなさい。

于 2011-04-26T13:20:56.547 に答える
1

を使用する必要がありますflask.current_app。これは、現在のアプリケーションにアクセスするためのプロキシ オブジェクトであり、一部の拡張機能で使用されているものです。したがって、コードは次のようになります。

from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(current_app)

次に、db通常どおりにオブジェクトを使用します。しかし、ユーザーがあなたのモジュールを使用しflaskext.sqlalchemyflask.

于 2011-08-15T12:06:35.297 に答える