コンテンツにスキップ

設定

Starletteは、12要素モードに従って構成とコードを厳密に分離することを推奨しています。

設定は、環境変数に格納するか、ソースコード管理にコミットされていない .env ファイルに格納する必要があります。

sqlalchemyからcreate_engineをインポート
Starlette. applicationからStarletteをインポート
from starlette. config import設定
starlette. datastructureからCommaSeparatedStringsインポート,秘密

#Configは環境変数や". env"ファイルから読み込まれます。
config=Config(". env")

DEBUG=config('DEBUG', cast=bool,default=False)
DATABASE_URL=config('DATABASE_URL')
Secret_KEY=config('Secret_KEY', cast=Secret)
ALLOWED_HOSTS=config('ALLOWED_HOSTS',cast=CommaSeparatedStrings)

app=Starlette(デバッグ=デバッグ)
engine=create_engine(DATABASE_URL)
...


これをソースコントロールにコミットしないでください。
例えば、`.gitignore` ファイルに". env"を含める。
デバッグ=True
DATABASE_URL=postgresql://ユーザー:password@localhost: 5432/データベース
シークレットKEY=43n080musdfjt54t-09sdgr
ALLOWED_HOSTS=127.0.0.1,localhost

優先順位の設定

設定値の読み取り順序は次のとおりです。

  • 環境変数です。
  • から .env ファイル。
  • は config で与えられるデフォルト値です。

これらが一致しない場合、config(...) はエラーをスローします。

秘密

機密キーの場合、Secret クラスは、保持されている値がバックトラックやその他のコード内省に漏洩する可能性を最小限に抑えるのに役立つため、便利です。

Secret インスタンスの値を取得するには、明示的に文字列に変換する必要があります。これは、値が使用されている場所でのみ行う必要があります。

>>>from my projectインポート設定
>>>設定。Secret_KEY
シークレット('*********')
>>>str(settings. SECRET_KEY)
'98 n 349$%8 b 8-7 yjn 0 n 8 y 93 T$23 r'

ヒント

databases から DatabaseURL を使用できます。 パッケージここ データベースURLを保存し、ログに漏洩しないようにします。

コンマ区切り文字列

CommaSeparatedStrings 型は、単一の構成キーに複数のコンテンツを格納する場合に便利です。

>>>from my projectインポート設定
>>>print(settings. ALLOWED_HOSTS)
CommaSeparatedStrings(['127.0.0.1','localhost'])
>>>print(list(settings. ALLOWED_HOSTS))
['127.0.0.1','localhost']
>>>print(len(settings. ALLOWED_HOSTS))
2
>>>print(settings. ALLOWED_HOSTS[0])
'127.0.0.1'

環境の読み取りまたは変更

場合によっては、環境変数をプログラムで読み込んだり変更したりすることがあります。これは、環境内の特定のキーを上書きしたい場合があるテストで特に役立ちます。

os.environ から読み書きするのではなく、Starletteの environ インスタンスを使用する必要があります。 このインスタンスは標準の os.environ にマッピングされており、設定が環境変数を読み取った後に設定した場合、エラーを発生させることでさらに保護されます。

pytest を使用している場合は、tests/conftest.py で任意の初期環境を設定できます。

starlette. configから環境をインポート

environ['DEBUG']='TRUE'

プレフィックス付きの環境変数を読み取る

env_prefix パラメータを設定することで、環境変数に名前空間を割り当てることができます。

OSをインポート

from starlette. config import設定

os. environ['APP_DEBUG']='yes'
os. environ['環境']='dev'

config=Config(env_prefix='APP_')

DEBUG=config('DEBUG')#APP_DEBUGを検索し、"yes"を返します。
ENVIRONMENT=config('ENVIRONMENT')#APP_ENVIRONMENTを検索し、変数が定義されていないためKeyErrorを発生させる

完全な例

大規模なアプリケーションの構築は複雑になる可能性があります。構成とコードを適切に分離したり、テスト中にデータベースを分離したり、別のテストデータベースと本番データベースを使用したりする必要があります。

ここでは、アプリケーションの構築を開始する方法を示す完全な例を見ていきます。

まず、設定、データベーステーブル定義、およびアプリケーションロジックを分離しましょう。

from starlette. config import設定
starletteからデータ構造をインポートSecret

config=Config(". env")

DEBUG=config('DEBUG', cast=bool,default=False)
Secret_KEY=config('Secret_KEY', cast=Secret)

DATABASE_URL=config('DATABASE_URL')


sqlalchemyをインポート

データベーステーブルの定義。
Metadata=sqlalchemy. MetaData()

組織=sqlalchemy. Table(
    ...
)


Starlette. applicationからStarletteをインポート
ミドルウェアのインポート
starletteからSession Middlewareをインポート
from starlette. routingインポートルート

my projectから設定をインポート


async defホームページ(request):
    ...

ルート=[
    ルート("/",エンドポイント=ホームページ)
]

ミドルウェア=[
    ミドルウェア(
        セッションミドルウェア,
        secret_key=settings. SECRET_KEY,
    )
]

アプリ=Starlette(debug=settings. DEBUG、ルート=ルート、middleware=middleware)

次に、テスト構成について説明します。テストスイートが実行されるたびに新しいテストデータベースを作成し、テストが完了したら削除します。また、

starlette. configから環境をインポート
starlette. testclientからTestClientをインポート
sqlalchemyからcreate_engineをインポート
sqlalchemy_utilsからcreate_Database, database_プレゼンス,drop_Databaseをインポート

この行は、'settings'がインポートされた後に使用するとエラーが発生します。
environ['DEBUG']='TRUE'

my projectから設定をインポート
アプリmyproject.appインポート
my project. tablesからメタデータをインポート


@pytest. fix(autouse=True,scope="session")
def set up_test_database():
    """
    テストを実行するたびにクリーンなテストデータベースを作成します。
    """
    url=settings. DATABASE_URL
    エンジン=create_engine(url)
    データベースが存在しない(url)、'テストデータベースはすでに存在します。テストを中止します。'
    create_database(url)#テストデータベースを作成します。
    metadata. create_all(engine)#テーブルを作成します。
    テストを実行します。
    drop_database(url)#テストデータベースをドロップします。


@pytest. fix()
def client():
    """
    「クライアント」フィクスチャをテストケースに使用できるようにします。
    """
    #私たちのフィクスチャはコンテキストマネージャー内に作成されます。これにより、
    #アプリケーションの寿命は、すべてのテストケースで実行されます。
    TestClient(app)をtest_clientとして使用します:
        利回りテストクライアント