Flask site under IIS on Windows)を実行し、アウトプロセスタスクにはCeleryを使用します。CeleryはWindowsでいくつかの問題を引き起こしましたが、今のところ、バージョン3.1.12を実行し、RabbitMQ/AMQPをバックエンドとして使用してWindowsで動作することに満足しています。
Celery(4)の新しいバージョンには Windowsのサポートが削除されました があるため、実行可能な代替手段を探しています。
RQは非常に良いタスクキューのようですが、Windowsもサポートしていません( ページの下部)
次のように、あまり人気のないタスクキューをいくつか見ました。
しかし、これらがWindowsとFlaskをサポートしているかどうかは不明です。 WindowsでPythonタスクキューが機能することを経験した経験があるかどうか疑問に思います。おそらく、私が言及したものの1つか、それとも別の方法です。
Linuxを管理する経験がないため、Linuxマシンを実行することはできません。また、Windowsを必要とする多くのレガシー機能を実行しています。
私はFlask問題なくWindowsでHueyを使用して、確かに開発とテストのためにのみ実行します。本番環境では、LinuxサーバーでFlask/Hueyを使用します。両方ともRedisバックエンドでFlask 0.12およびHuey 1.2.0。
ファクトリパターンを使用して、Flaskアプリの特別な「カットダウン」バージョンを作成し、Hueyタスクで特定の用途に使用します。このバージョンではブループリントが読み込まれないか、Flask-Adminが構成されていないため、 Hueyタスクでは必須です。
アプリフォルダー内の___init__.py
_のコード例。 App
はFlask
から拡張されたクラスです:
_def create_app(settings_override=None):
app = App('app')
if settings_override:
app.config.from_object(settings_override)
else:
app.config.from_object(os.environ['APP_SETTINGS'])
from .ext import configure_extensions
configure_extensions(app, admin, load_modules=True)
# REST
import rest.api_v1
app.register_blueprint(api_v1_bp, url_prefix='/api/v1')
# ... and more suff
def create_huey_app():
app = App('huey app')
app.config.from_object(os.environ['APP_SETTINGS'])
from .ext import configure_extensions
configure_extensions(app, admin=None, load_modules=False)
return app
_
_configure_extensions
_のアイデアは Quokka CMS から採用されています。 app
___init__.py
_ と extensions module を調べて、これがどのように実装されているかを確認してください。このプロジェクトでも、Celeryタスクキューで使用する特定のアプリ(_create_celery_app
_)を作成する方法に注意してください。
_tasks.py
_の例。 Flaskコンテキストを作成するためのwith app.app_context():
の使用に注意してください。これで、私の関数はFlask-Mail、Flask-SqlAlchemy(db、models)などの拡張機能にアクセスできます。
_@huey.task()
def generate_transaction_documents_and_email(transaction_id):
app = create_huey_app()
with app.app_context():
reports.generate_transaction_documents_and_email(transaction_id)
@huey.task()
def send_email(subject, recipients, text_body, html_body, attachments=[], cc=[]):
app = create_huey_app()
with app.app_context():
emails.send_email(subject, recipients, text_body, html_body, attachments, cc)
@huey.periodic_task(crontab(minute='30'))
def synchronize_mailing_list():
app = create_huey_app()
if app.config['CREATESEND_SYNCHRONIZE']:
_list_name = app.config['CREATESEND_LIST']
with app.app_context():
sync_delete_ar_subscribers(_list_name)
sync_add_ar_subscribers(_list_name)
_