flask design patterns
このチュートリアルでは、Webアプリケーションを設計する際に従うべき一般的なFlaskデザインパターンとベストプラクティスのいくつかを例を挙げて説明します。
アプリケーションの設計は、ソフトウェア開発の重要な側面です。計画外のアプリケーション設計は、克服できない技術的負債をもたらします。したがって、アプリケーションをスケーリングする場合はいつでも、時間テスト済みのデザインパターンを試してみることができます。
Flaskコミュニティには、アプリケーションのいくつかのパターンを試してみたいときに、刺激を与え、設計上の決定に影響を与える可能性のある多くの例があります。 Flaskは非常に非ピニオンで柔軟性があるため、既存のパターンの概念を組み合わせて新しいパターンを作成することもできます。
=> フラスコを最初から学ぶには、こちらにアクセスしてください
学習内容:
フラスコのデザインパターン
例えば、 MVCパターンからシングルページアプリケーション、SAASパターンまで多くの例があります。あなたはデザインパラダイムに名前を付けます、そしてそれはすでにコミュニティの誰かによって試みられており、あなたが実際に試すために自由に利用できます。
以下にリストされているのは、一見の価値のあるリポジトリのいくつかです。
Flusk
Fluskは、SQLAlchemy、Docker、Nginxを含む大きなFlaskアプリケーションを作成するために使用できる例です。バックエンド、ドメイン、ビュー、およびモデルをそれぞれのレイヤーに作成するための美しいロジック分離があります。
Flaskブループリントの優れた使用法があり、ファクトリデザインパターンに従います。 Fluskで拡張機能を作成するのは簡単で、Dockerを使用してアプリケーションをコンテナ化するのもさらに簡単です。そのソースコードを見てください ここに 。
ダルマザメフラスコ
Cookiecutter Flaskは、アセットのバンドルやWebpackによる縮小などの機能を備えたフラスコテンプレートです。ユーザー登録/認証用のスターターテンプレートがあり、Bootstrap4上に構築されています。
Cookiecutterは、Pythonパッケージプロジェクトを作成するためのコマンドラインユーティリティです。つまり、このテンプレートを使用すると、FlaskアプリケーションをPyPIとして公開することもできます。このプロジェクトは活発に開発されています。
で評価する価値があります このリンク 。
フラスコフル
Flask fullは、Celery、MongoEngine、Signals、Shellコマンド、WebSocket、およびeventletを利用するもう1つのパワーパックされたボイラープレートです。 SwaggerAPIドキュメントおよびSphinxドキュメントと非常によく統合されています。
このプロジェクトをソースとして評価します。それは自由に利用可能です ここに 。
薄っぺら
軽量のアプリケーションを作成するには、Flaskyを検討することをお勧めします。 Flaskyのソースコードが利用可能です ここに 。このリポジトリは、Web開発で25年以上の経験を持つMiguelGrinbergによって作成されました。
彼はFlaskyを作成して、彼の著書で説明されている概念のコード例を提供しました。 FlaskWeb開発 。
どちらを選択しても、フレームワークまたはテンプレートのいずれを選択しても、これらすべてにいくつかの標準機能があり、独自の方法でそれらについて説明します。ここでは、これらの機能のいくつかをリストして説明し、このチュートリアルシリーズのサンプルアプリケーションでFlask-Appbuilderを使用してそれらを実装します。
このチュートリアルでは、今日のほとんどすべてのWebアプリケーションに見られる、Web開発者のキットに含まれていると便利ないくつかの一般的なパターンについて説明します。
Flaskログインの例
Webアプリケーションでは通常、割り当てられた特権に基づいて、ユーザーがアプリケーションの制限された部分に登録してアクセスする必要があります。ユーザーには権限ベースの役割があります。 例えば、 パブリックユーザーには、別のユーザーを作成する権限がありません。ただし、管理者ユーザーにはこれらの権限があります。
Webアプリケーションは、デフォルトまたは事前定義されたアクセス許可を割り当てることにより、ユーザー登録とユーザー作成を自動化する場合があります。
オフラインでユーザーを作成する
を使用して、flask fabcreate-userコマンドを使用してユーザーを作成しましょう。このコマンドを使用すると、ユーザーアカウントの詳細を示すコマンドラインプロンプトが表示されます。以下に示すような詳細を入力すると、ユーザーが作成されます。
Role (Public): Username: user1 User first name: User1 User last name: Last1 Email: user1@sthwebsite.com Password: Repeat for confirmation: ## various logs 2020-06-21 13:55:01,053:INFO:flask_appbuilder.security.sqla.manager:Added user user1 User user1 created.
コマンド出力の最後に、sqla.managerがユーザー作成の確認メッセージを出力することに注意してください。
次に、アプリケーションにアクセスし、入力した詳細を使用してログインします。本番データベースでユーザーを作成した場合は、このアカウントを作成した人にそれらの詳細を渡します。
http:// localhost:8080 / loginに移動すると、次のようなログインフォームが表示されます。

user1がログインすると、ユーザーはウェルカムメッセージを見ることができます。

オンラインでユーザーを作成する
すべてのユーザーをオフラインで作成することは不可能かもしれません。さらに、本番環境でflask fab create-userコマンドを使用するには、より技術的な専門知識が必要になる場合があります。ほとんどの場合、ユーザーの作成を担当する管理者からワークロードを取り除く必要がある場合があります。
したがって、このサンプルWebアプリケーションでは、ユーザーが自分で登録できるようにしましょう。
GoogleのreCAPTCHAサービスを使用して、悪意のある攻撃者がアプリケーションの制限された部分にアクセスするのを防ぎます。
まず、GoogleのreCAPTCHAサービスにドメインを登録し、SITEキーとSECRETキーを取得しましょう。
ステップ1: 以下のコマンドを使用してFlask-Mailをインストールします。
pip install Flask-Mail
https://www.google.com/recaptcha/intro/v3.htmlにアクセスし、Googleアカウントを使用して管理者としてログインします。
ステップ2: reCaptchaのタイプを選択します。

ステップ3:GoogleのreCaptchaを使用するドメインを指定します。
また、このキーの許可されたドメインのリストにローカルホストを追加し、条件に同意して送信します。この機能の開発後、後で削除できます。
ステップ4: 公開鍵とも呼ばれるサイト鍵を書き留めます。

ステップ5: 秘密鍵とも呼ばれる秘密鍵を書き留めます。

上記のようにキーを書き留めたら、それらを参照して構成で読み取ることができる場所に保存するのが最善です。このチュートリアルでは、値を環境変数としてSITE_KEYおよびSECRET_KEYとして保存しました。
次に、config.pyを開き、以下に示すように更新します。
# Will allow user self registration AUTH_USER_REGISTRATION = True# The default user self registration role AUTH_USER_REGISTRATION_ROLE = 'Public'# Config for Flask-WTF Recaptcha necessary for user registration RECAPTCHA_PUBLIC_KEY = os.environ.get('SITE_KEY', None) RECAPTCHA_PRIVATE_KEY = os.environ.get('SECRET_KEY', None) # Config for Flask-Mail necessary for user registration MAIL_PORT = 587 MAIL_USE_SSL = False MAIL_SERVER = 'smtp.gmail.com' MAIL_USE_TLS = True MAIL_USERNAME = 'sthtestmail@gmail.com' MAIL_PASSWORD = 'Passw0rdqwerty' MAIL_DEFAULT_SENDER = 'sthtestmail0@gmail.com'
Googleアカウントへの安全性の低いアクセスを有効にする必要がある場合があります。メール関連の問題が発生した場合は、以下のURLでアカウントアクセスを有効にしてください。

- https://accounts.google.com/DisplayUnlockCaptcha
- https://support.google.com/mail/?p=BadCredentials
ログインページに、追加のユーザー登録ボタンが表示されます。登録をクリックすると、reCaptchaチャレンジとともに多くのフィールドが表示されます。

電子メールに登録してreCaptchaチャレンジに合格すると、以下に示すような確認メッセージが表示されます。

登録時に送信したメールが有効な場合は、下の画像に示すようなアカウントアクティベーションメールが届きます。

Flask管理者
このFlaskチュートリアルシリーズの他のチュートリアルを読んだ場合は、Flask-Appbuilderに付属する組み込みのセキュリティを利用していることに気付くでしょう。 add_view_no_menuを使用して追加したビューは保護されていません。ただし、DataModelsに基づいて追加したビューは、管理者ユーザーに対して自動的に保護されます。
あるいは、Flask-Adminを利用することもできますが、これはほとんど同様の結果を達成します。 Flask-Adminも、オブジェクト指向の方法でビューを定義しましょう。フロントエンドのWebページは、インターフェイスに明示的に追加するビュークラスのメソッドを表します。
このチュートリアルでは、Flask-Adminは使用しません。代わりに、同じ結果をより高速に達成し、ログイン、認証、ロール、およびアクセス許可に関するセキュリティ構築について知る必要性をスキップするという道を歩みます。 Flask-Appbuilderを使用したので可能でした。
Flask-AppbuilderとFlask-Adminの両方に長所と短所があります。 Flask-Adminの場合、既存のセキュリティの前提条件がなく、セキュリティモデルに基づいてアプリを作成できることを知っておく必要があります。 Flask-Adminの詳細については、次のWebサイトをご覧ください。 ここに 適切な例を見ていきます。
フラスコファイルのアップロード
最近のほとんどすべてのWebアプリケーションには、ファイルの保存と提供の要件があります。それらの典型的なパターンは、サーバー上のパスにファイルを保存し、保存されたファイルに対して操作を実行し、アプリケーションモデルとビューに保持するための情報を提供することです。
同様の例に取り組みます。追加機能を使用してソングモデルを変更しましょう。
models.pyファイルに次のコードを入力します。
from flask import Markup, url_for from flask_appbuilder.models.mixins import FileColumn from flask_appbuilder.filemanager import get_file_original_name from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship class Song(Model): id = Column(Integer, primary_key=True) title = Column(String(200), nullable=False) rating = Column(Integer) album_id = Column(Integer, ForeignKey('album.id')) # for storing MP3 file of the song song_file = Column(FileColumn, nullable=False) album = relationship('Album') def __str__(self): return self.title def download(self): return Markup( ' Download ' ) def file_name(self): return get_file_original_name(str(self.song_file))
FileColumnタイプの新しい列を追加することにより、以前に作成したSongモデルを変更しました。さらに、SongsViewに追加される2つの列を追加して、ファイル名とアップロードされたファイルをダウンロードするためのリンクを表示します。
ダウンロードをリンクとして表示するために、Flaskurl_forメソッドがマークアップとともに使用されています。また、Flask-Appbuilderのget_file_original_nameメソッドを使用しました。これは、同じファイル名間の衝突を回避するために、ファイル名をUUIDと連結して保存するためです。
以下のコードでviews.pyを変更して、対応するSongsViewを更新します。
class SongsView(ModelView): datamodel = SQLAInterface(Song) label_columns = {'file_name' : 'File Name', 'download': 'Download'} list_columns = ('title', 'file_name', 'download') show_columns = ('title', 'file_name', 'download')
SongsViewクラスでは、表示する必要のある新しいラベルについて説明しました。指定したリストに記載されている列のみを一覧表示します。
ここで、モデルに列を追加してデータベースモデルを変更したことを覚えておく必要があります。データベース内の対応するテーブルには、この新しい列がありません。したがって、前回のチュートリアル以降SQLiteデータベースで作業しているため、app.dbファイルを削除します。
または、flask dbmigrateコマンドを使用してバージョンファイルに必要な変更を加え、flask dbupgradeを使用してテーブルを更新することもできます。ただし、導入した変更は最小限であり、アプリケーションデータベースとユーザーを再作成できます。
本番環境では、アプリケーションのデータベーススキーマに変更を加えるたびに、Flask-Migrateコマンドの使用を検討することをお勧めします。
以下のコマンドを使用してデータベースファイルを削除し、adminユーザーを再度作成します。
rm app.db flask fab create-db flask fab create-admin
次に、管理者の資格情報を使用してアプリケーションにログインすると、次の画像に示すように、変更されたSongsViewが表示されます。

ファイル付きの曲を追加します。
不和で動作するボイスチェンジャー

ファイルを保存すると、ビューの列は次のようになります。

config.pyの次の値に注意してください。アップロードされたファイルは、サーバー上のこのパスに保存されます。このチュートリアルでは、このサンプルアプリケーションを開発しているマシンにアップロードされます。
config.pyに記載されているように、アップロードパスを確認します。以下に示すように、ファイルはUUIDとともに保存されます。

フラスコHTTPS
開発に関する限り、HTTPSなしでFlaskアプリケーションを実行し続けることができます。セキュリティの観点から、HTTPSは、正当なクライアントとサーバー間で通信が行われることを保証します。
この暗号化された通信では、公開鍵と秘密鍵のペアを持つCA署名付き証明書を使用して、クライアントとサーバーの間に信頼を確立する必要があります。それについてもっと読んでください ここに
このチュートリアルでは、開発中にHTTPを使用してFlaskベースのWebサイトを開発する方法を説明します。
開発中にHTTPSを含める最も速くて簡単な方法は、以下のrun.pyで説明するように、アドホックssl_contextを使用することです。ただし、環境にpipを使用してpyopensslをインストールしてください。
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context='adhoc')
ssl_contextを追加した後、https:// localhost:8080 /に移動すると、この通信で使用されている証明書の有効性について疑問を投げかける警告が表示されます。さらに、http:// localhost:8080 /へのナビゲーションは機能しなくなります。
したがって、このアプローチは少し面倒であり、開発サーバーを再起動するたびにこの要求を受け入れ続ける必要があります。
以下に示すように、作業を続行するには、安全でないアクセスをクリックする必要があります。

または、https機能を使用して開発するために、Pythonタプルの証明書とキーへのパスをrunメソッドのssl_contextパラメーターに渡すことができます。ただし、このアプローチを採用するには、以下のコマンドを使用して自己署名証明書とキーを生成する必要があります。
openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365
尋ねられたクエリに適切な値を指定します。

すべてのデフォルト値を残しました。次に、開発サーバーを停止し、以下に示すようにパス証明書とキーパスを渡します。
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context=('mycert.pem', 'mykey.pem'))
このアプローチは、アドホックssl_contextを使用する以前の方法にも似ています。ただし、この場合、詳細はより長く保持されます。 365日について触れました。必要な日に有効期限を指定できます。さらに、チームで開発している場合は、これらのファイルを他のチームメンバーと共有できます。
実稼働環境では、証明書はCAによって発行され、MiguelGrinbergがいくつかの使用例について説明します。 ここに 。そのページで詳細を読むことをお勧めします。
結論
このチュートリアルでは、Flaskログイン、Flask管理、Flaskファイルアップロード、FlaskHTTPSに関連する機能を開発する際にWeb開発者が従ういくつかのパターンについて説明しました。コード例を提供しましたが、読者もそれを試すことができます。
次のチュートリアルでは、Flaskの拡張の概念を取り上げ、RESTAPIベースの機能を作成する方法を確認します。さらに、Flask内でTwitterAPIを使用する方法についても説明します。
推奨読書
- Javaのデザインパターン:シングルトン、ファクトリ、ビルダー
- PythonFlaskチュートリアル-初心者向けFlaskの概要
- 例を含むFlaskAPIチュートリアル| APIを使用したフラスコの拡張
- ブループリントとブートストラップを使用したFlaskアプリとFlaskプロジェクトのレイアウト
- Django対Flask対ノード:どのフレームワークを選択するか
- 回答付きの人気のあるPythonフラスコインタビューの質問トップ31
- 複雑なデータモデルを構築するためのトップ10データベース設計ツール
- トップ11のUI / UXデザイントレンド:2021年以降に何を期待するか