2

いくつかの設定に従ってモジュールをロードしようとしています。実用的なソリューションを見つけましたが、高度な Python 開発者から、このソリューションを使用する API エンドポイントが高負荷になるため、このソリューションが最適なパフォーマンスであることを確認する必要があります。

アイデアは、ユーザーおよび他のシステム構成からのパラメーターに基づいてエンドポイントの動作を変更することです。これらの設定に基づいて、正しいハンドラー クラスをロードしています。目標は、ハンドラーを呼び出すコードを変更することなく、新しいハンドラーを簡単に作成できるようにすることです。

これは実用的な例です:

./run.py :

from flask import Flask, abort 
import importlib 
import handlers  

app = Flask(__name__)  

@app.route('/') 
def api_endpoint():     
    try:         
        endpoint = "simple" # Custom logic to choose the right handler        
        handlerClass = getattr(importlib.import_module('.'+str(endpoint), 'handlers'), 'Handler')         
        handler = handlerClass()     
    except Exception as e:         
        print(e)         
        abort(404)      

    print(handlerClass, handler, handler.value, handler.name())      

    # Handler processing. Not yet implemented

    return "Hello World"  

if __name__ == "__main__":     
    app.run(host='0.0.0.0', port=8080, debug=True)

「単純な」ハンドラーの例。ハンドラーは、ハンドラー クラスを定義する必要があるモジュールです。

./handlers/simple.py :

import os  

class Handler:     
    def __init__(self):         
        self.value = os.urandom(5)      

    def name(self):        
        return "simple"

私の理解が正しければ、インポートはエンドポイントへのクエリごとに行われます。これは、モジュールのルックアップを伴うファイルシステム内の IO を意味します...

この戦略を実装するのは正しい/「pythonic」な方法ですか?

4

1 に答える 1

1

質問はコードレビューに移動しました。ご協力いただきありがとうございます: https://codereview.stackexchange.com/questions/96533/extension-pattern-in-a-flask-controller-using-importlib

このスレッドを閉じます。

于 2015-07-10T20:19:04.220 に答える