jinja2テンプレートフィルターを使用するフラスコアプリケーションがあります。テンプレートフィルターの例は次のとおりです。
@app.template_filter('int_date')
def format_datetime(date):
if date:
return utc_time.localize(date).astimezone(london_time).strftime('%Y-%m-%d %H:%M')
else:
return date
これは、デコレータが定義される前にインスタンス化されたアプリがある場合は正常に機能しますが、フラスコスクリプトマネージャーと組み合わせてアプリファクトリを使用している場合、インスタンス化されたアプリはありません。以下の場合の例:
def create_my_app(config=None):
app = Flask(__name__)
if config:
app.config.from_pyfile(config)
return app
manager = Manager(create_my_app)
manager.add_option("-c", "--config", dest="config", required=False)
@manager.command
def mycommand(app):
app.do_something()
Managerは、インスタンス化されたアプリまたはアプリファクトリのいずれかを受け入れるため、一見すると、次のことができるように見えます。
app = create_my_app()
@app.template_filter('int_date')
....
manager = Manager(app)
このソリューションの問題は、インスタンス化中にアプリが既に構成されているため、マネージャーがオプションを無視することです。では、誰かがフラスコスクリプト拡張機能と一緒にテンプレートフィルターをどのように使用することになっているのでしょうか?
ここで青写真が役立ちます。ブループリントcore
を定義し、すべてのカスタムテンプレートフィルターをたとえばに配置しcore/filters.py
ます。
ブループリントを使用するときにフラスコ内のアプリケーションにフィルターを登録するには、のapp_template_filter
代わりにを使用する必要がありますtemplate_filter
。このようにして、デコレータパターンを使用してフィルタを登録し、アプリケーションファクトリアプローチを使用できます。
ブループリントを使用するアプリケーションの一般的なディレクトリレイアウトは、次のようになります。
├── app
│ ├── blog
│ │ ├── __init__.py # blog blueprint instance
│ │ └── routes.py # core filters can be used here
│ ├── core
│ │ ├── __init__.py # core blueprint instance
│ │ ├── filters.py # define filters here
│ │ └── routes.py # any core views are defined here
│ └── __init__.py # create_app is defined here & blueprint registered
└── manage.py # application is configured and created here
このアプローチの最小限の実用例については、https://github.com/iiSeymour/app_factoryを参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加