ホームページ  >  記事  >  バックエンド開発  >  Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)

Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)

WBOY
WBOY転載
2022-03-01 18:23:414970ブラウズ

この記事では、python に関する関連知識を提供し、主に Flask の動作原理に関連する問題を紹介し、Flask への理解を深めるために Flask の動作原理の簡単な分析を行います。みんなが助けてくれることを願っています。

Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)

推奨学習: Python 学習チュートリアル

すべての Python Web フレームワークは WSGI プロトコルに従う必要がありますが、ここでも引き続き行う必要があります簡単に復習してみましょう。WSGI の中核となる概念を見てみましょう。

WSGI には非常に重要な概念があります。それは、すべての Python Web アプリケーションは呼び出し可能なオブジェクトであるということです。 flask では、このオブジェクトは app = Flask(name) によって作成されたアプリであり、下の図の緑色の Application 部分です。 Web アプリケーションを実行するには、Python でおなじみの Apache、nginx、Gunicorn などの Web サーバーが必要です。以下では werkzeug が提供する WSGIServer について説明します。これらは、下の図の黄色のサーバー部分です。
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
サーバーとアプリケーション間の通信方法は WSGI の機能です。 app(environ, start_response) のインターフェイスを指定します。サーバーはアプリケーションを呼び出し、それに 2 つのパラメータを渡します: environ にはリクエストのすべての情報が含まれます。start_response はアプリケーションの処理後に呼び出される必要がある関数です。パラメータはステータスです。コードとレスポンス、ヘッダーにはエラー メッセージもあります。

WSGI アプリケーションの非常に重要な機能は、ネストできることです。つまり、(プロキシと同様に) 別のアプリケーションを呼び出して返すアプリケーションを作成できます。一般に、ネストの最後の層はビジネス アプリケーションで、中間はミドルウェアです。この利点は、ビジネス ロジックとその他の機能 (電流制限、認証、シリアル化など) を異なる中間層に実装できることです。異なる中間層とビジネス ロジックは関連しておらず、独立して保守できます。ユーザーは、また、さまざまなニーズを満たすために、さまざまな中間層を動的に組み合わせることができます。
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
Flask は、Werkzeug WSGI ツールボックスと Jinja2 テンプレート エンジンに基づいています。 Flask は BSD ライセンスに基づいてライセンスされています。 Flask は、単純なコアを使用し、拡張機能を使用して機能を追加するため、「マイクロフレームワーク」とも呼ばれます。 Flask にはデフォルトのデータベースやフォーム検証ツールがありません。ただし、Flask には拡張の柔軟性があり、Flask 拡張機能を使用して、ORM、フォーム検証ツール、ファイル アップロード、さまざまなオープン認証テクノロジなどの機能を追加できます。 Flask がコア、その他の機能がプラグインであると理解できますが、どのような機能が必要でも、対応するプラグインを見つけてコアに挿入すれば、その機能を実現できます。

Flask はどのようにしてコードを目に見える Web ページに変換するのでしょうか?まず、Web プログラムの一般的なプロセスを見ていきます。Web アプリケーションの場合、クライアントが動的リソース (ASP や PHP などの言語で書かれた Web サイトなど) を取得したいときに、この時点では HTTP リクエスト (ブラウザを使用して URL にアクセスするなど)、この時点で Web アプリケーションはサーバーのバックグラウンドで対応するビジネス処理 (データベースの操作や一部の計算操作の実行など) を実行し、ユーザーが必要とするデータを取得し、対応する HTTP レスポンスを生成します (もちろん、静的リソースにアクセスする場合、サーバーはユーザーが必要とするリソースを直接返し、ビジネス処理を実行しません)。処理プロジェクト全体は次のとおりです。
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
実際のアプリケーションでは、異なるリクエストが同じ処理ロジックを呼び出す場合があります。同じ業務処理ロジックを持つ HTTP リクエストは、URL の種類によって識別できます。たとえば、私たちのブログ サイトでは、記事のコンテンツを取得するすべてのリクエストは、article/ などの URL で表すことができます。ここでのarticle_id は、さまざまな記事を区別するために使用されます。次に、バックグラウンドで get_article(article_id) 関数を定義し、記事の対応するデータを取得します (また、URL と関数は 1 対 1 に対応する必要があります)。次の図に示すように、これは Web 開発におけるいわゆるルート配布です:
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
Flask では、ルート配布に werkzeug が使用されます。Werkzeug は、Flask によって使用される基盤となる WSGI ライブラリです (WSGI,正式名 Web サーバー ゲートウェイ インターフェイス (Python Web サーバー ゲートウェイ インターフェイス) は、Python 言語用に定義された Web サーバーと Web アプリケーション間のシンプルで共通のインターフェイスです。
WSGI は、Web サービスをサーバーとアプリケーションの 2 つの部分に分割します。 WGSI サーバーは、ネットワークに関連する 2 つのこと、つまりブラウザからの HTTP リクエストの受信とブラウザへの HTTP レスポンスの送信のみを担当し、HTTP リクエストの特定の処理ロジックは WSGI アプリケーションを呼び出すことによって実行されます。 WSGI のワークフローを以下の図に示します。
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
Flask では、ルート配布コードは次のように非常に簡単に記述できます。

# 管理员注销页面
@main.route('/logout')
def logout():
    dm = DataManager()
    currentUsers = dm.getUsers('0')
    print(currentUsers[0])
    return render_template('currentUsers.html', users=currentUsers)

必要なデータを取得した後、ビジネス ロジック関数を使用すると、サーバーはこれらのデータに基づいて HTTP 応答を生成します (Web アプリケーションの場合、通常は HTML ファイルであり、クライアント (ブラウザー) が直接読み取って解釈できます)。 Web 開発では、取得したデータを Web アプリケーションが提供する HTML テンプレート ファイルに渡し、テンプレート システムでレンダリングした後、最終的に必要な HTML 応答ファイルを取得するのが一般的です。
一般的に、リクエストは異なりますが、レスポンスのデータの表示方法は同じです、平たく言えば、取得をリクエストするデータ以外はすべて同じであれば、テンプレートを設計できます。 (データ内容を変更できる点を除き、残りは固定の HTML ファイルです)。ブログ サイトを例に挙げると、各記事の具体的な記事内容は異なりますが、タイトル ブロックやコンテンツ列など、要求されたデータを除いてページに表示されるコンテンツは同じです。つまり、記事の場合は、HTML テンプレートを提供し、その後、さまざまな HTTP 応答を取得するためにさまざまな記事データを渡すだけで済みます。以下の図に示すように、これはいわゆるテンプレート レンダリングです。
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
テンプレート レンダリングには Flask の Jinja2 テンプレート レンダリング エンジンを使用します (Jinja2 は Python ベースのテンプレート エンジンであり、その機能は似ています) PHP Smarty 、J2ee の Freemark および Velocity に準拠しています。Unicode を完全にサポートし、広く使用されている統合サンドボックス実行環境を備えています。Jinja2 は BSD 認証を使用します)。 Jinja2 のワークフローを次の図に示します:
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
Flask では、テンプレート レンダリング コードも非常に簡単に記述できます。コードは次のとおりです:

@app.route('/articles/<article_id>/') 
defget_article(article_id):
returnrender_template('path/to/template.html', data_needed)</article_id>

Flask では、リクエスト プロセスでは、まずユーザーが送信した URL に基づいてどのビジネス ロジック関数が処理されるかを決定し、次に関数内で操作を実行して必要なデータを取得します。取得されたデータは対応するテンプレート ファイルに渡され、Jinja2 が HTTP 応答コンテンツ、つまり HTTP 応答の HTML ファイルをレンダリングし、Flask が応答コンテンツを返します。
以下では、主にサンプルプロジェクトを使用して、Flask の動作原理を簡単に分析します。サンプル プロジェクトでは、プログラム ファクトリ関数とブループリントが使用されます。プロジェクトのディレクトリ構造は次のとおりです。
Flaskの動作原理を解析するPython学習(画像と文章で詳しく解説)
manager.py ファイルには、プロジェクト起動のためのエントリ関数が定義されています。

# 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。
if __name__ == '__main__':
    # 启用cmd命令行
    # manager.run()
    app.run(host='0.0.0.0', port=9000, debug=True)

同时,在该文件中创建了工厂方法实例:

	app = create_app()

  在工程方法中,对数据库进行了相关配置,创建了前端导航栏,同时对所创建的蓝本进行了注册。在创建的蓝本中主要涉及授权、路由及错误处理模块。

# 构造工厂方法
def create_app():
    # 在这里__name__ == __main__
    app = Flask(__name__)
    app.url_map.converters['regex'] = RegexConverter
    # 防止跨站攻击 注:为了增强安全性,密钥不应直接写入代码,而应该保存在环境变量中
    # app.config['SECRET_KEY'] = 'hard to guess string SUNNY2017'
    # app.secret_key = 'Sunny123456'

    # flask提供的读取外部文件
    app.config.from_pyfile('config')

    # basedir = os.path.abspath(os.path.dirname(__file__))
    # print(basedir)

    # 配置数据库连接
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://lmapp:lmapp@localhost/smp'
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

    nav.register_element('top', Navbar(u'APP安盾',
                                       View(u'当前在线', 'main.index'),
                                       View(u'全部用户', 'main.all_users'),
                                       View(u'注销', 'main.logout'),
                                       View(u'修改密码', 'main.chgpwd'),
                                       ))
    nav.init_app(app)
    db.init_app(app)
    bootstrap.init_app(app)
    # init_views(app)
    from .auth import auth as auth_blueprint
    from .main import main as main_blueprint
    # 注册蓝本 url_prefix='/auth'
    app.register_blueprint(auth_blueprint,)
    app.register_blueprint(main_blueprint, static_folder='static')
    return app

 推荐学习:python教程

以上がFlaskの動作原理を解析するPython学習(画像と文章で詳しく解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。