[ FastAPI ] 추가 모델
이전 예시에 이어서 생각해볼 때, 하나보다 더 많이 연결된 모델을 사용하는 게 흔한 상황일 것입니다.
이것은 사용자 모델에 대한 특별한 경우입니다. 왜냐하면:
- 입력 모델은 비밀번호를 갖게 해야하기 때문입니다.
- 출력 모델은 비밀번호를 가져서는 안 되기 때문입니다.
- 데이터베이스 모델은 아마도 해시된 비밀번호를 갖게 해야하기 때문입니다.
위험
절대 사용자의 숨김 없는 비밀번호를 저장하시면 안 됩니다. 항상 확인할 수 있는 "보안 해시"를 저장하기 바랍니다.
만약 이를 모른다면, "비밀번호 해시"가 무엇인지에 대해 보안 챕터에서 배울 수 있습니다.
다중 모델
여기 비밀번호 필드와 사용될 수 있는 공간에 따라 어떻게 모델이 생겼는지 알 수 있는 일반적인 개념이 있습니다:
**user_in.dict()
Pydantic의 .dict()
user_in 은 UserIn 클래스의 Pydantic 모델입니다.
Pydantic 모델은 해당 모델의 데이터와 함께 dict 을 반환하는 .dict() 메서드를 갖습니다.
따라서, 만약 Pydantic 객체 user_in 을 다음과 같이 생성하면:
아래와 같이 호출할 수 있습니다:
이제 (Pydantic 모델 객체 대신 dict 인) 변수 user_dict 에 담긴 데이터와 함께 dict 을 가지게 됩니다.
그리고 만약 아래와 같이 호출하면:
다음과 같은 파이썬 dict 을 얻습니다:
dict 풀기
만약 user_dict 과 같은 dict 을 얻고 **user_dict 을 사용하여 이것을 함수 (또는 클래스) 에 전달한다면, 파이썬은 이것을 "풀고" user_dict 의 키와 값을 키-값 인자로 직접 전달합니다.
따라서, 위의 user_dict 을 계속해서, 다음과 같이 적으면:
결과는 다음과 유사할 것입니다:
또는 더 정확하게, 어떤 내용이 추후에 들어올지, user_dict 을 직접 사용할 수 있습니다:
다른 내용으로부터 전달 받은 Pydantic 모델
아래 코드와 같이, 위 예시를 통해 user_in.dict() 으로부터 user_dict 을 얻게 되었습니다:
이것은 이것과 동일합니다:
...왜냐하면 user_in.dict() 은 dict 이고, ** 을 앞에 붙여 파이썬 "풀기"를 활용해 UserInDB 에 전달할 수 있기 때문입니다.
따라서, 다른 Pydantic 모델 속 데이터로부터 Pydantic 모델을 얻을 수 있습니다.
dict 풀기와 추가 키워드
그리고 다음과 같이, 추가 키워드 인자 hashed_password=hashed_password 를 추가할 수 있습니다:
...결과는 아래와 같습니다:
주의
지원하는 추가적인 기능은 단지 데이터의 가능한 흐름에 관한 시연일 뿐, 실제 보안을 제공하지는 않습니다.
중복 제거
코드 중복 제거는 FastAPI의 핵심 개념 중 하나입니다.
코드가 중복될 수록 버그, 보안 문제, (한 곳에서는 수정했지만 다른 곳에서는 하지 않아 발생하는) 코드 비동기화 문제, 기타 등등의 문제점들이 증가합니다.
그리고 이러한 모델은 모두 많은 데이터를 공유하고 어트리뷰트 이름과 자료형을 복제합니다.
이를 더 좋게 바꿀 수 있습니다.
다른 모델을 위해 기본으로 제공되는 UserBase 모델을 선언할 수 있습니다. 그리고 이 어트리뷰트 (자료형 선언, 유효성 검사, 기타 등등) 를 상속 받는 모델의 서브클래스를 만들 수 있습니다.
이러한 방법으로, 단지 (숨김 없는 텍스트 password , hashed_password 그리고 비밀번호를 사용하지 않는 경우와 같은) 모델 간의 차이점만 선언할 수 있습니다:
Union 또는 anyOf
두 자료형의 Union 이 되게 응답을 선언할 수 있고, 이것은, 응답이 둘 중 아무거나 될 수 있다는 걸 의미합니다.
anyOf 를 통해 OpenAPI에서 정의됩니다.
이를 위해, 표준 파이썬 자료형 힌트 typing.Union 을 사용하시기 바랍니다:
참고
Union 을 정의할 때, 가장 구체적인 자료형을 우선 포함하고, 다음으로 덜 구체적인 자료형을 선언하시기 바랍니다. 아래 예시에서, Union[PlaneItem, CarItem] 속에 더 구체적인 PlaneItem 이 CarItem 보다 우선 작성되어 있습니다.
모델의 리스트
동일한 방법으로, 객체의 리스트의 응답을 선언할 수 있습니다.
이를 위해, 표준 파이썬 typing.List 을 사용하시기 바랍니다:
임의의 dict 을 사용한 응답
순수한 임의의 dict 을 사용하여 응답을 선언할 수도 있고, Pydantic 모델을 사용하지 않고, 단지 키와 값으로만 선언할 수도 있습니다.
이것은 만약 (Pydantic 모델을 위해 요구되는) 유효한 필드/어트리뷰트 이름을 우선적으로 모르고 있을 때 유용합니다.
이 경우, typing.Dict 을 사용할 수 있습니다:
요약
다중 Pydantic 모델을 사용하고 각 상황에 맞게 자유롭게 상속받기 바랍니다.
사용자 "개체"가 password , password_hash 그리고 비밀번호를 사용하지 않는 상태를 포함한 경우처럼, 만약 개체가 반드시 다른 "상태"를 가지고 있어야 하는 경우 개체마다 단일 데이터 모델이 필요하지 않습니다.
원문
https://fastapi.tiangolo.com/tutorial/extra-models/
'FastAPI > Tutorial - User Guide' 카테고리의 다른 글
[ FastAPI ] 폼 데이터 (0) | 2021.09.25 |
---|---|
[ FastAPI ] 응답 상태 코드 (0) | 2021.09.25 |
[ FastAPI ] 응답 모델 (0) | 2021.09.20 |
[ FastAPI ] 헤더 매개변수 (0) | 2021.09.20 |
[ FastAPI ] 쿠키 매개변수 (0) | 2021.09.19 |