たけし備忘録

自分の好奇心の赴くままに勉強メモ LL系が大好き Python bash Julia C

7.プラグイン

プラグイン

バージョン0.9の新機能。
ボトルのコア機能は、ケースを使用する最も一般的なカバーですが、マイクロフレームワークとしてそれには限界がある。 "プラグイン"が遊びに来る場所です。プラグインは、フレームワークに欠けている機能を追加するサードパーティ製のライブラリを統合する、または単にいくつかの反復作業を自動化します。
我々は、使用可能なプラグインの成長のリストを持っており、ほとんどのプラグインは、アプリケーション間での移植性、再利用できるように設計されています。チャンスはあなたの問題がすでに解決されたことを高く、すぐに使用できるプラグインが存在しています。されていない場合は、プラグイン開発ガイドはあなたを助けるかもしれません。
エフェクトとプラグインAPIは、多様であり、特定のプラグインに依存しています。例えばSQLitePluginプラグインは、dbのキーワード引数を必要とするコールバックを検出し、新しいデータベース接続オブジェクトのコールバックが呼び出されるたびに作成されます。これは非常に便利なデータベースを使用できるようになります。

from bottle import route, install, template
from bottle_sqlite import SQLitePlugin
install(SQLitePlugin(dbfile='/tmp/test.db'))
@route('/show/<post_id:int>')
def show(db, post_id):
    c = db.execute('SELECT title, content FROM posts WHERE id = ?', (post_id,))
    row = c.fetchone()
    return template('show_post', title=row['title'], text=row['content'])
@route('/contact')
def contact_page():
''' This callback does not need a db connection. Because the 'db'
    keyword argument is missing, the sqlite plugin ignores this callback
    completely. '''
    return template('contact')

他のプラグインは、スレッドセーフなローカル·オブジェクトを移入し、要求オブジェクトの詳細を変更するには、コールバックによって返されるデータをフィルタ処理したり、完全にコールバックを回避する可能性があります。例えば、 "auth"というプラグインが有効なセッションをチェックし、元のコールバックを呼び出す代わりに、ログインページを返すことができます。正確には何が起こるかはプラグインに依存しています。


アプリケーション全体のインストール

プラグインは、アプリケーション全体または単に追加の機能を必要とするいくつかの特定のルートにインストールすることができます。ほとんどのプラグインは、安全にすべてのルートにインストールされ、その機能を必要としないコールバックにオーバーヘッドを追加しないように十分にスマートであることができます。
私たちは例えばSQLitePluginプラグインを見てみましょう。それだけでデータベース接続を必要とするルートのコールに影響を与えます。他のルートはそのままにしています。このため、我々は追加のオーバーヘッドがアプリケーション全体のプラグインをインストールすることができます。
プラグインをインストールするには、(インストール)を呼び出す最初の引数としてプラグインを使って:

from bottle_sqlite import SQLitePlugin
install(SQLitePlugin(dbfile='/tmp/test.db'))

プラグインはまだルートのコールには適用されません。これがないルートが失われていないことを確認するために延期されます。は、まずプラグインをインストールし、変更したい場合は、後でルートを追加することができます。インストールされているプラ​​グインの順序は、しかし、重要である。プラグインがデータベース接続を必要とする場合には、まずデータベースプラグインをインストールする必要があります。


プラグインのアンインストール

あなたは()以前にインストールしたプラグインをアンインストールするには、名前、クラス、またはインスタンスを使用することができます。

sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db')
install(sqlite_plugin)
uninstall(sqlite_plugin) # uninstall a specific plugin
uninstall(SQLitePlugin) # uninstall all plugins of that type
uninstall('sqlite') # uninstall all plugins with that name
uninstall(True) # uninstall all plugins at once

リクエストを処理しながら、プラグインがあっても、実行時に、いつでもインストールおよび削除することができます。これは、いくつかのきちんとしたトリックを(スロー·デバッグをインストールしたり、必要なプラグインだけをプロファイリング)を有効にしますが、使い古されてはいけません。たびにプラグインの変更点のリストは、ルートキャッシュがフラッシュされ、すべてのプラグインが再適用されます。

注意

モジュールレベルのインストール()とアンインストール()関数は、デフォルトのアプリケーションに影響を与えます。特定のアプリケーション用のプラグインを管理するには、ボトルのアプリケーションオブジェクト上の対応するメソッドを使用しています。


ルート固有のインストール

ルートの適用パラメータ()を使用すると、経路のごく少数にプラグインをインストールする場合は、デコレータに便利です。

sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db')
@route('/create', apply=[sqlite_plugin])
def create(db):
db.execute('INSERT INTO ...')



ブラックリストプラグイン

明示的にルートの数のプラグインを無効にすることができます。ルート()デコレータは、この目的のためのスキップ·パラメータがあります。

sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db')
install(sqlite_plugin)
@route('/open/<db>', skip=[sqlite_plugin])
def open_db(db):
    # The 'db' keyword argument is not touched by the plugin this time.

    # The plugin handle can be used for runtime configuration, too.
    if db in ('test', 'test2'):
        sqlite_plugin.dbfile = '/tmp/%s.db' % db
        return "Database File switched to: /tmp/%s.db" % db
    abort(404, "No such database.")

スキップ·パラメータは、単一の値または値のリストを受け入れます。あなたはスキップされるプラグインを識別するための名前、クラス、またはインスタンスを使用することができます。一度にすべてのプラグインをスキップする= Trueをスキップして設定します。


プラグインとサブアプリケーション

ほとんどのプラグインは、それらがインストールされたアプリケーションに固有のものです。その結果、彼らはBottle.mount()でマウントされたサブアプリケーションに影響を及ぼすべきではありません。次に例を示します。

root = Bottle()
root.mount('/blog', apps.blog)
@root.route('/contact', template='contact')
def contact():
    return {'email': 'contact@example.com'}
root.install(plugins.WTForms())

あなたがアプリケーションをマウントするたびに、ボトルには、サブアプリケーションに転送するすべての要求は、メインアプリケーションのプロキシ·ルートを作成します。プラグインはデフォルトでは、プロキシ経路この種の無効になっています。結果として、私たちの(架空の)WTFormsプラグインは/コンタクト経路に影響を与えますが、/ブログサブアプリケーションのルートには影響ありません。
この動作は、正気のデフォルトとして意図されていますが、オーバーライドすることができます。次の例は、再活性化し、特定のプロキシの経路のすべてのプラグイン
root.mount('/blog', apps.blog, skip=None)
しかし、思わぬ障害があります:プラグインは単一のルートとして、サブアプリケーション全体を見て、すなわち、プロキシルートは、上記の。サブアプリケーションの個々の経路に影響を与えるためには、明示的にマウントされたアプリケーションにプラグインをインストールする必要があります。


次の記事へ進む → 8.開発


関連リンク