인프런 커뮤니티 질문&답변

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

FastAPI 완벽 가이드

FastAPI의 Form 검증 적용 및 Pydantic Model 기반으로 검증 적용하기

Depends()에 사용되는 인자는 어떤 것들이 가능한 것인가요?

작성

·

11

0

  1. Path(), Query(), Form() 모두 Depends에 사용이 가능할까요? 물론 BaseModel에는 인자와 동일한 이름의 클래스 변수가 정의되어 있다는 가정에서 의미합니다.

  2. form의 일부 인자들만으로 구성되게 사용이 가능할까요?

  3. 함수의 입력 인자로 정의된 값이, Depends에서도 중복으로 사용이 가능한가요?

답변 2

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

1, 2, 3을 따로 말씀드리는 것 보다 아래로 설명드리는 게 더 좋을 것 같습니다.

'Path(), Query(), Form() 모두 Depends에 사용이 가능할까요?' 의미가 Depends(Path) 와 같이 사용한다는 의미인가요? 이 경우라고 가정하고(아니면 다시 글 부탁드립니다)

일단 이렇게 사용하시면 안됩니다. 그리고 그럴 필요도 없습니다.

먼저 Depends(Path)는 오류가 발생할 것입니다.

그리고 그럴 필요가 없는게, Path() 자체가 Dependency injection 방식으로 동작합니다.

가령 아래의 코드에서

@app.get("/items/{item_id}")

async def read_items( item_id = Path(...)):

.....

수행함수 read_items()의 인자로 Path()가 입력되지만, Path()를 호출하여 request에서 path parameter 값을 구한 뒤 수행 함수 read_items()에 인자로 입력하는 것은 사용자가 아니라 fastapi framework이 수행하는 것입니다. 바로 Dependency injection이 하는 역할 입니다.

FastAPI에서 제공하는 Path(), Query(), Form()은 모두 이런 방식으로 제공되므로 별도의 Dependency injection을 할 필요가 없습니다.

Depends는 일반 함수를 Path()등과 같은 Dependency injection 화 하기 위해 사용되는 것으로 이해해 주셔도 됩니다.

 

감사합니다.

bluebamus님의 프로필 이미지
bluebamus
질문자

만약 store/{category_id}/{item_id}?user=""&order=""
이런 형식의 url 구조가 있고 form을 통해 데이터가 들어온다는 가정에서,

path 파라미터와 query 파라미터를 결합하여 id를 만들어 key값의 프리픽스 부분을 만들고 form 정보를 이용해 값을 만들어야 한다는 시나리오가 있다면,

 

사실 모든 정보가 Depends로 넘어가야 합니다.
그리고 공용으로 사용되는 함수에는 로직이 들어갈 수 없기 때문에 Depends에 사용되는 함수에는 model_validator를 위한 코드 외에는 정의하지 않는게 원칙이 될거 같은데

 

결국 view로 사용되는 함수에 모든 입력 인수가 정의되어야 하고, Depends에도 모든 입력 인수가 넘어가야 하는 상황이 되어야 맞다고 생각이 됩니다.

굳이 Depends를 사용하지 않아도 되지만, 강의에서 말씀하신대로 Schema\ 폴더에 관리되는 코드라 최대한 준수하고자 한다면,

 

이런 경우 view 함수의 인자에 모두 정의된 입력 인자, Path, Query, Form들이 그대로 Depends에서도 사용이 가능한지가 궁금한 것이었습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

FastAPI에서 Depends()를 활용하는 방법에 대한 질문을 주셨네요. Depends()는 FastAPI의 의존성 주입 매커니즘으로, 여러 상황에서 다양한 인자들을 사용하여 유연하게 작동할 수 있습니다.

  1. Path(), Query(), Form() 모두 Depends()에서 사용 가능합니다. 이들은 FastAPI의 특수한 데이터 타입 및 파라미터로, 라우트 함수 내에서 직접 사용하든지, Depends()로 주입된 함수나 클래스에서 사용하든지 무관하게 작동합니다. 예를 들어 Depends()에 주입할 함수에서 이러한 파라미터를 선언할 수 있습니다.

  2. 특정 폼의 일부 인자만 사용하는 것도 가능합니다. BaseModel이나 직접 정의한 의존성을 통해 필요한 부분만을 선택적으로 사용할 수 있습니다. 이렇게 하면 필요 없는 데이터는 무시하면서 원하는 폼 필드만을 처리할 수 있습니다.

  3. 함수의 입력 인자가 Depends()와 중복되는 것은 가능합니다. FastAPI는 함수에 정의된 인자와 의존성으로 주입되는 인자를 구분하여 처리합니다. 따라서 두 곳에서 동일한 이름의 인자를 정의하더라도 명확히 구분하여 동작합니다.

더 자세한 설명이 필요한 경우, FastAPI 공식 문서의 의존성 주입 부분을 참고해 보시는 것을 추천드립니다. 거기서는 다양한 상황에서 의존성을 다루는 방법을 자세히 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

질문하기