4

数秒でレイアウトされたフラスコアプリケーションがありますMethodView

MethodViews の 1 つで、各リクエストの前にデータベース接続を開き、リクエストの後に閉じたいと考えています

@app.before_requestグローバル関数と関数の使用方法は知っています@app.teardown_requestが、それらはすべてのリクエストに対して実行されます。特定の MethodView のルートに対してのみ実行される限定バージョンが必要です。

4

2 に答える 2

3

サブクラスを作成する場合、MethodViewこれを行う最も簡単な方法は、適切なメソッドのいずれかが次の場合に呼び出される関数を追加することです。

class AutoConnectingView(MethodView):
    def setup(self):
        # Connect to the database here and store the connection on self.
        self.db = connect_to_db()

    def teardown(self):
        self.db.close()

    def dispatch_request(self, *args, **kwargs):
        self.setup()
        response = super(AutoConnectingView, self).dispatch_request(*args, **kwargs)
        self.teardown()
        return response


class ARoomWithAView(AutoConnectingView):
    def get(self):
        rooms = self.db.execute("SELECT * FROM RoomsWithViews")
        return render_template("rooms.html", rooms=rooms)
于 2013-01-01T02:30:39.723 に答える
2

特定のビューをデータベース依存としてタグ付けするデコレータを使用できます。

NoSQLStore = {}

class NoSQL(object):
    """ fake """
    def query(self, key): 
        return '%s\n' % NoSQLStore.get(key, 'no such key')
    def put(self, key, value):
        NoSQLStore[key] = value

def with_database(fn):
    """ Decorator for functions, that need database access.
        NoSQL object will be stored under ``g.db``. 
    """
    def connect_and_close(*args, **kwargs):
        g.db = NoSQL()
        __result = fn(*args, **kwargs)
        # a real database should be somehow ``closed()`` here
        return __result
    return connect_and_close

class StoreAPI(MethodView):

    @with_database
    def get(self):
        return g.db.query(request.args.get('key'))

    @with_database
    def post(self):
        key, value = str(random.randint(0, 1000)), str(random.randint(0, 1000))
        g.db.put(key, value)
        return 'set %s => %s\n' % (key, value)

実行可能なスタンドアロンの例は、https ://gist.github.com/4424587にあります。

于 2013-01-01T02:50:50.317 に答える