Перейти к содержанию

Конфигурация

Starlette рекомендует строго отделить конфигурацию от кода в соответствии с двухэлементной моделью.

Конфигурация должна храниться в переменной среды или в файле .env, который не был передан в управление исходным кодом.

Из sqlalchemy import create_engine
Из Starlette.applications Import Starlette
Из starlet.config import Config
from starlette.datastructures import CommaSeparatedStrings, Secret

# Config will be read from environment variables and/or ".env" files.
config = Config(".env")

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

app = Starlette(debug=DEBUG)
engine = create_engine (DATABASE)
...


Don't commit this to source control.
# Eg. Include ".env" in your `.gitignore` file.
DEBUG=True
DATABASE_URL =postgresql://user:password@localhost:5432/database
SERET_KEY =43n080musdfjt54t-09sdgr
ALLOWED_HOSTS =127.0.0.1, localhost

Приоритет конфигурации

Порядок чтения значений конфигурации:

  • Из переменных среды.
  • из файла .env.
  • имеет значение по умолчанию в config.

Если они не совпадают, то config(...) вызовет ошибку.

Секрет

Класс Secret полезен для чувствительных ключей, так как он помогает свести к минимуму случаи, когда его значение может просочиться в ретроспективе или в другой интроспекции кода.

Чтобы получить значение экземпляра Secret, его необходимо явно преобразовать в строку. Вы должны делать это только в том месте, где используется значение.

>>>>> Import Settings
>> settings. secret_key
Secret ('****************')
>> str(settings.secret_Key)
'98n349 $ % 8b8 - 7yjn0n8y93T $23r'

Советы

Вы можете использовать DatabaseURL from databases package here to store database URL и avoid leaking them in the logs.

Строки-разделители запятые

Тип CommaSeparatedStrings полезен для размещения нескольких компонентов в одном клюже настройки.

>>>>> Import Settings
>>>> 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'

Чтение и изменение среды

В некоторых случаях вам может потребоваться запрограммированное чтение или изменение переменных среды. Это особенно полезно при тестировании, когда вы можете записать определенные ключи в среде.

Вы должны использовать экземпляр environ Starlette, а не читать или писать из os.environ. Этот экземпляр сопоставляется со стандартным os.environ и, если конфигурация уже прочитала какие-либо переменные среды, этот экземпляр обеспечит дополнительную защиту, вызвав ошибку.

Если вы используете pytest, вы можете настроить любую начальную среду в tests/conftest.py.

Из starlette.config import environ

«Дебау»(англ.)-«True '»

чтение переменных среды с префиксами

Переменные среды можно разделить пространственные имена, установив параметр env_prefix.

Импортные os

Из starlet.config import Config

os.environ ['APP_DEBUG']= 'yes'
os.environ ['Environement'] = 'dev'

config = Confix ='APP_')

DEBUG = config ('DEBUG') # lookups APP_DEBUG, returns "yes"
ENVIRONMENT = config ('ENVIRONMENT') # lookups APP_ENVIRONMENT, raises KeyError as variable is not defined

Один полный пример

Создание больших приложений может быть сложным. Вам нужно правильно разделить конфигурацию и код, изолировать базу данных во время тестирования, использовать отдельные тестовые и производственные базы данных и многое другое.

Здесь мы рассмотрим полный пример, который показывает, как мы можем начать создавать приложение.

Прежде всего, давайте разделим наши настройки, определения таблиц базы данных и логику нашего приложения:

Из starlet.config import Config
Из Starlette.datastructures import Secret

config = Config(".env")

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

DATABASATA_URL = config ('DATABASE_URL')


sqlimport alchemy

# Database table definitions
Metadata = sqalchemy ()

Слайд ((
    ...
)


Из Starlette.applications Import Starlette
from Starlette.middleware import Middleware
from Starlette. middleware.sessions import SessionMiddleware
От Starlet.routing Import Route

Из Myproject Import Settings


async def homepage(request):
    ...

routes = [
    Route("/", endpoint=homepage)
]

middleware = [
    Местность (
        SessionMiddleware,
        secret_key = settings.secret_key,
    )
]

app = Starlette(debug= settings.DEBUG, routes=routes, middleware=middleware)

Теперь давайте разберемся с нашей тестовой конфигурацией. Мы хотим создать новую тестовую базу данных при каждом запуске тестового пакета и удалить ее по завершении. Мы также хотим убедиться, что

Из starlette.config import environ
Testclient Import TestClient
Из sqlalchemy import create_engine
from sqlalchemy_utils import create_database, database_exists, drop_database

# This line would raise an error if we use it after 'settings' has been imported.
«Дебау»(англ.)-«True '»

Из Myproject Import Settings
from myproject.app import App
Из Myproject tables import metadata


pytest.fixture (autouse=True, scope="session")
database def_test_database ()
    """
    Создайте clean test database every time the tests are run.
    """
    url = settings.DATABASE
    engine = create_engine (url)
    assert not database_exists (url), 'Test database already exists. Aborting tests.'
    create_database (url)             Создать базу данных тестирования.
    metadata. create_all (engine)      Создать табл.
    Yield                            Run the Tests.
    drop_database (url)               # Drop the test database


Pytest.fixture ()
def client():
    """
    Создайте "клиент" fixture available to test cases.
    """
    Our fixture is created within a context manager. -Это изменение
    # Application Lifespan runs for every test case.
    with TestClient(приложение) as test_client:
        Yield Test_клиент