콘텐츠로 이동

구성

Starlette는 12 요인 패턴에 따라 구성과 코드를 엄격하게 분리하도록 권장합니다.

구성은 환경 변수 또는 소스 제어에 커밋되지 않은 .env 파일에 저장해야 합니다.

sqlalchemy에서 _
Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
Starlette.config에서 가져오기 구성
Starlette.data에서 가져오기CommaSeparatedStrings, 비밀

# Config는 환경 변수 및/또는 ".env" 파일에서 읽습니다.
구성 = 구성(. "env")

디버그 = 구성('디버그', 캐스트 = 볼, 기본값 = 거짓)
DATABASE_URL = 구성('DATABASE_URL')
SECRET_KEY = 구성('SECRET_KEY', 캐스트 = 비밀)
허용됨_호스트 = 구성('허용됨_호스트', cast=CommaSeparatedStrings)

앱=스타렛(디버그=디버그)
엔진 = create_ (DATABASE_URL)
...


# 이것을 소스 제어에 커밋하지 마십시오.
# 예.`.gitignore` 파일에 "env"를 포함합니다.
디버그 = 참
DATABASE_URL = post ql: // 사용자: password@localhost: 5432 / 데이터베이스
비밀_KEY=43n080musdfjt54t-09sdgr
허용됨_호스트 =127.0.0.1,localhost

우선 순위 구성

구성 값의 읽기 순서는 다음과 같습니다.

  • 환경 변수에서. .env 파일의 입니다. config 에서 가 제공하는 기본값입니다.

이 중 일치하는 항목이 없으면 config(...) 에서 오류가 발생합니다.

비밀

민감한 키의 경우 Secret 클래스는 보유하고 있는 값이 역추적 또는 기타 코드 내성으로 유출될 가능성을 최소화하는 데 도움이 되기 때문에 유용합니다.

Secret 인스턴스의 값을 얻으려면 문자열로 명시적으로 변환해야 합니다. 값이 사용되는 경우에만 이 작업을 수행해야 합니다.

>> 내 프로젝트에서 설정 가져오기
>> 설정. 비밀_KEY
비밀 ('***********')
>> str (설정.SECRET_KEY)
'98N349 $%8b8-7yjn0n8y93T $23r'

힌트

databases 의 DatabaseURL 를 사용할 수 있습니다. 포장 여기 데이터베이스 URL을 저장하고 로그에서 누출되지 않도록 합니다.

쉼표로 구분된 문자열

CommaSeparatedStrings 유형은 단일 구성 키에 여러 콘텐츠를 보관하는 데 유용합니다.

>> 내 프로젝트에서 설정 가져오기
>> 인쇄(설정.ALLOWED_HOSTS)
CommaSeparatedStrings(['127.0.0.1', 'localhost'])
>> 인쇄(목록(설정 허용 _ HOSTS))
['127.0.0.1', 'localhost']
>> 인쇄(len(설정.ALLOWED_HOSTS))
2
>> 인쇄 (설정. ALLOWED_HOSTS [0])
'127.0.0.1'

환경 읽기 또는 수정

경우에 따라 환경 변수를 프로그래밍 방식으로 읽거나 수정할 수 있습니다. 이 기능은 환경의 특정 키를 재정의할 수 있는 테스트에서 특히 유용합니다.

os.environ 에서 읽거나 쓰는 대신 Starlette의 environ 인스턴스를 사용해야 합니다. 이 인스턴스는 표준 os.environ 에 매핑되며 구성이 환경 변수를 읽은 후 설정한 경우 오류를 발생시켜 추가 보호 기능을 제공합니다.

pytest 를 사용하는 경우 tests/conftest.py 에서 초기 환경을 설정할 수 있습니다.

Starlette.config에서 가져오기 환경

환경 ['디버그'] = '트루'

접두사 환경 변수 읽기

env_prefix 매개 변수를 설정하여 환경 변수를 네임스페이스할 수 있습니다.

OS 가져오기

Starlette.config에서 가져오기 구성

Os.environ ['APP_DEBUG'] = '예'
Os. 환경 ['환경'] = '개발'

구성 = 구성 (env_prefix = 'APP_')

DEBUG = config ('DEBUG') # 조회 APP_DEBUG, "예"를 반환합니다.
환경 = 구성('환경') # 조회 APP_ENVIRONMENT, 변수가 정의되지 않아 키 오류가 발생합니다.

완전한 예

대규모 애플리케이션을 구축하는 것은 복잡할 수 있습니다. 구성과 코드를 적절하게 분리하고, 테스트 중에 데이터베이스를 분리하고, 별도의 테스트 및 프로덕션 데이터베이스를 사용해야 합니다.

여기서는 애플리케이션 구축을 시작하는 방법을 보여주는 전체 예를 살펴보겠습니다.

먼저 설정, 데이터베이스 및 테이블 정의, 애플리케이션 로직을 분리해 보겠습니다.

Starlette.config에서 가져오기 구성
Starlette.data에서 비밀 가져오기

구성 = 구성(. "env")

디버그 = 구성('디버그', 캐스트 = 볼, 기본값 = 거짓)
SECRET_KEY = 구성('SECRET_KEY', 캐스트 = 비밀)

DATABASE_URL = 구성('DATABASE_URL')


sqlalchemy 가져오기

# 데이터베이스 테이블 정의.
메타데이터 = sqlalchemy. 메타데이터()

조직 = sqlalchemy. 테이블(
    ...
)


Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
Starlette.middleware에서 미들웨어 가져오기
Starlette.middle.에서 SessionMiddleware 가져오기
별자리에서. 라우팅 가져오기 경로

내 프로젝트에서 가져오기 설정


Async def 홈페이지(요청):
    ...

경로 = [
    경로("/", 엔드포인트 = 홈페이지)
]

미들웨어 = [
    미들웨어(
        세션 미들웨어,
        비밀 키 = 설정.비밀 키,
    )
]

앱 = 스타렛(디버그 = 설정. 디버그, 경로 = 경로, middleware=middleware)

이제 테스트 구성을 처리하겠습니다. 테스트 제품군이 실행될 때마다 새 테스트 데이터베이스를 만들고 테스트가 완료된 후 삭제하려고 합니다. 우리는 또한 그것을 보장하고 싶습니다.

Starlette.config에서 가져오기 환경
Starlette.testClient에서 TestClient 가져오기
sqlalchemy에서 _
sqlalchemy_utils에서 create_, ase_, drop_

# '설정'을 가져온 후 사용하면 오류가 발생합니다.
환경 ['디버그'] = '트루'

내 프로젝트에서 가져오기 설정
myproject.app에서 앱 가져오기
myproject.table에서 메타데이터 가져오기


@Pytest.ture (자동 = 참, 범위 = "세션")
Def setup_test_ ():
    """
    테스트를 실행할 때마다 깨끗한 테스트 데이터베이스를 만듭니다.
    """
    URL = 설정.DATABASE_URL
    엔진 = create_ (url)
    데이터베이스가 존재하지 않는다고 주장합니다. (url), '테스트 데이터베이스가 이미 존재합니다. 테스트 중단.'
    create_ (url) # 테스트 데이터베이스를 만듭니다.
    메타데이터. create_all (엔진) # 테이블을 만듭니다.
    항복 # 테스트를 실행합니다.
    drop_ (url) # 테스트 데이터베이스를 삭제합니다.


@pytest.ture ()
데프 클라이언트():
    """
    테스트 케이스에 사용할 수 있는 '클라이언트' 고정장치를 만드십시오.
    """
    # 우리의 고정장치는 컨텍스트 관리자 내에서 만들어집니다. 이것은 그것을 보장합니다
    # 애플리케이션 수명은 모든 테스트 케이스에 대해 실행됩니다.
    TestClient(앱)를 test_client로 사용:
        수율 테스트_클라이언트