구성
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로 사용:
수율 테스트_클라이언트