Конфигурация
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_клиент