フラスコ基礎API:フラスコ基本


この投稿方法

  • このポストは、Pythonとフラスコを使用してREST APIを作成する方法を解剖するシリーズの一部です.
  • 各々のポストは、読者が読まれて、シリーズのすべての前のポストを理解したという仮定の下で書かれます.
  • 道に沿ったあらゆる選択を説明しようと思います.あなたが私が何かを残したと感じるならば、下記のコメントで言及してください.
  • 各セクションでは、なぜ説明し、どのように特定の技術や技術を使用する.あなたが既に快適であるセクションをスキップすること自由に感じなさい.
  • このシリーズに対して生成されたソースコードはGithubにあります.
  • ダバンティー / Pythonレスト


    基本的なフラスコ休息APIを示しているサンプルプロジェクト


    こんにちは!私はフラスコについて追跡するためにこのレポを作成しました、しかし、私はそれを終えて、決して決しません.私は実際には、Pythonの残りのAPIを作成するには本当に素晴らしい経験のために同じことをお勧めします.
    View on GitHub

    このポストで


    このポストは、工場のパターンを使用して、非常に単純なフラスコアプリを作成するまで歩いてください.そして、テスト駆動の開発をPyTestで使用することによって、青写真で簡単な健康チェックコントローラをつくります.このポストの終わりに、あなたは、完全なテスト報道で非常に単純なウェブサーバを持っています!

    トピック

  • フラスコ工場パターン
  • docstring
  • 型注釈
  • テスト駆動開発
  • pytest
  • フラスコ青写真
  • フラスコ工場パターン


    フラスコの全体はFlask アプリケーションオブジェクト、Flaskを使用して起動しなければならない最初のことは、プロジェクト内のどこかのオブジェクトを作成することです.このチュートリアルでは2つの一般的な方法があります:
  • ファイル内のオブジェクトを作成します(通常は“app . py”と呼ばれます).この方法に対する主要な利点は、より少ないボイラー板があり、あなたがすぐに起きることができて、速く走ることができるということです.

  • アプリケーションのインスタンスを返す“ファクトリメソッド”を宣言します.このメソッドはもう少しタイピングが必要ですが、多くの利点があります.
  • 循環的な依存関係を避けるためにファクトリメソッドに入れることによってインポートを遅延させます(拡張モジュールを使用するときに非常に重要です).
  • 拡張の遅延初期化(単位テストのパッチを簡単にする)
  • 動的に異なるユースケースのアプリケーションを設定することができます
  • さらに多くの、チェックアウトhere
  • 私は常に工場のメソッドを使用してお勧めします、それはかなり簡単に始めるために.まず、メソッド自体をベースに作成します__init__.py モジュールです.
    # python_rest/__init__.py
    from flask import Flask
    
    
    def create_app():
        return Flask(__name__)
    
    それはアプリを宣言するためのすべてのコードです!ここでは、フラスコ開発サーバで実行する必要があります.

    コマンドラインで走る


    我々は簡単にコマンドラインで詩を使用してアプリケーションを実行することができますが、最初に我々は何を実行するフラスコを指示する必要があります.幸運にも、それは我々があらゆる種類のものを宣言させる環境ファイルのためのビルトイン支持で来ます.まず、追加python-dotenv 開発依存.
    $ poetry add -D python-dotenv
    
    ここで、“flasktle - app”という環境変数をモジュールの名前に設定します.

    Note: The Flask recommendation is to check the ".flaskenv" file into the project with any non-sensitive, default values. You can then override them with the more standard ".env" file which should never be checked into source control.


    # .flaskenv
    FLASK_APP=python_rest
    
    さて、開発サーバーを実行する準備が整いました.あなたが詩の下でそれを実行してください!
    $ poetry run flask run
    

    魅力的な

  • 画面の上部にある
  • をクリックします
  • フラスコサーバの選択
  • 「ターゲット型」を「モジュール名」に設定します
  • モジュール名に"target "を設定します(例えば"Pythonstra rest "
  • をクリックします
  • あなたの新しい構成を選択し、実行して起動する緑色の矢印をクリックして
  • 🎉 ああ!現在、あなたのローカルマシンのポート5000(デフォルトで)を実行しているWebサーバーを持っている!それはまだ何もしません、しかし、私はそれが走っていると約束します.

    docstring


    Python関数を書いたので、確実にその関数のdocstringを書くべきです.あなたのコードを文書化する理由は終りがありません、私はそれがすべての機能を少なくともストリングの要約でDocStringに与える最高の実行を見つけます.後にあなたのAPIのために良いドキュメンテーションを作成するために、docstringは重要です、それで、習慣的に習慣を得ることは最高です.
    そこにdocstringの形式の束があり、ほとんどがサポートされ、PyChargerでレンダリングすることができます.This page さまざまな形式の素晴らしい概要を提供します.私は他のタイプのプロジェクトで使用するスフィンクスによってネイティブにサポートされているので、再構築テキスト文字列を使用します.このように見えます.
    def create_app():
        """
        Creates an application instance to run
        :return: A Flask object
        """
        return Flask(__name__)
    

    型注釈


    私はタイプの注釈がいかに重要かを強調できません.Pythonのダイナミックなタイピングシステムはものすごいです、そして、コードを非常に速く書くことを作ります.しかし、簡単にあなたのプロジェクトは、より複雑になるように簡単にミスをすることができます.私はPyChargerが私が何かダム(何かを返すことを忘れているような)をしているとき、私に話すことができるようにすべてのものにヒントを入力します.我々のタイプ注釈create_app 関数は以下のようになります:
    def create_app() -> Flask:
    

    テスト駆動開発


    テスト駆動開発、またはTDDは、コード自体を書く前に、コードのテストを書くだけの行為です.これが良い考えである理由に書かれた全体の本があります、しかし、非常に単純に、これは私がそれをする理由です:
  • いつやっているか知っている
  • あなたはより自信を持ってリファクタリングすることができます
  • あなたが開始する前にエッジケースと不幸なパスを介して考えるのに役立ちます
  • モジュラと分離デザインを奨励する
  • pytest


    テストを書くためには、ある種のフレームワークを使用する必要があります.Python標準ライブラリに含まれるものは一つです.pytest . 使用する理由がたくさんありますが、その基本は以下の通りです.
  • 非常に小さいボイラー板
  • プラグインの負荷
  • つは、私は常にフラスコのアプリをテスト中に使用するプラグインはpytest-flask どの便利な備品の束を提供します.テストを開始するには、PyTestとPyTestのフラスコを開発依存としてインストールします.
    $ poetry add -D pytest pytest-flask
    
    PyChargerを使っているなら、PyTestを使うように設定します
  • オープン設定
  • ツールをクリック
  • Python統合ツール
  • 「デフォルトテストランナー」を「PyTest」に変えてください
  • Note: you can change Docstring format here too


    次に、テストディレクトリにPyTest(conftest . pyという)用の設定ファイルを作成します.テストが実行される前に、このファイルは常にインポートされます.また、使用する予定のすべてのフィクスチャを定義し、他のプリテストセットアップを実行する場所です.PyTestフラスコを使うために、我々は我々のFlask オブジェクト.
    # tests/conftest.py
    
    import pytest
    from flask import Flask
    
    
    @pytest.fixture
    def app() -> Flask:
        """ Provides an instance of our Flask app """
        from python_rest import create_app
    
        return create_app()
    
    

    青写真


    今私たちが打つことができるエンドポイントを作成する時間です.非常に一般的な習慣は、あなたのアプリケーションが実行されていることを確認するために何らかの健康チェック終点を持つことです.このエンドポイントを作成するために、我々はBluePrints(経路の下のコントローラのコレクション)に登録されるコントローラ(要求を処理する機能)を作成する必要があります.
    まず最初に、この新しいコードをどこに置くかを調べましょう.私はモジュールの下で「青写真」と呼ばれるモジュールで私が作成するどんな青写真も保つのが好きです.この青写真はルートパス("/")を管理するためです.
    次に、テストディレクトリにこのディレクトリ構造を反映させるべきです.適切に加えて__init__.py ファイル全体のプロジェクト構造は以下のようになります.
    python-rest
    |-- README.md
    |-- poetry.lock
    |-- pyproject.toml
    |-- python_rest
    |   |-- __init__.py
    |   `-- blueprints
    |       |-- __init__.py
    |       `-- root.py
    `-- tests
        |-- conftest.py
        `-- test_blueprints
            |-- __init__.py
            `-- test_root.py
    
    作成したいエンドポイントのテストを書きましょう.PyTest Fraskによって提供されたクライアントフィクスチャを使用して、適切にリクエストを実行できます.我々は、健康チェックがいくつかのJSON体で200(OK)の状態を返すことを望みます.次のテストです
    # tests/test_blueprints/test_root.py
    
    from http import HTTPStatus
    
    
    def test_health(client):
        response = client.get('/health/')
        assert response.status_code == HTTPStatus.OK, 'Health check failed'
        assert response.json == {'message': 'Healthy'}, 'Improper response'
    
    
    これらのアサートステートメントは、テストを実行するときにテストを通過させるか失敗するかを指定します.assert後のコンマの後の文字列は、チェックが失敗した場合に表示されるメッセージです.PyChargerの関数定義の横にある小さな緑色の矢印をクリックしたり、実行したりしてテストを実行しますpoetry run pytest コマンドラインで.いずれにせよ、あなたはそれが失敗するのを見るべきです.
    それでは、ルート青写真と実際の終点を作成しましょう.
    # python_rest/blueprints/root.py
    
    from flask import Blueprint
    
    # Declare the blueprint with whatever name you want to give it
    root_blueprint = Blueprint('root', __name__)
    
    
     # This is how you register a controller, it accepts OPTIONS and GET methods by default
    @root_blueprint.route('/health/')
    def health():
        return {'message': 'Healthy'}  # This will return as JSON by default with a 200 status code
    
    
    今、我々は実際には、コントローラに到達できるように、この青写真をアプリケーションに登録する方法が必要です.彼らはこれを行うには、アプリに青写真を登録アプリケーションの作成で呼び出される関数で行われます.慣例は、この関数“initloseアプリ”という名前を付けることです、そして私は一度にすべての青写真を登録する1つの“iInCountアプリ”機能を持っているのが好きです.論理的なことは、この関数を__init__.py BluePrintsモジュールの.
    # python_rest/blueprints/__init__.py
    
    from flask import Flask
    
    
    def init_app(app: Flask):
        from .root import root_blueprint
        app.register_blueprint(root_blueprint)
    
    
    今ちょうどあなたのCreateRoundアプリ工場機能からこの関数を呼び出す必要があります.
    # python_rest/__init__.py
    
    from flask import Flask
    
    
    def create_app() -> Flask:
        """
        Creates an application instance to run
        :return: A Flask object
        """
        app = Flask(__name__)
    
        from . import blueprints
        blueprints.init_app(app)
    
        return app
    
    
    それだ!あなたが再びテストを実行する場合は、今パスする必要があります!また、フラスコのアプリを実行してlocalhost:5000/health/ ブラウザでJSONレスポンスを確認します.