You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.6 KiB

Dependências avançadas

Dependências parametrizadas

Todas as dependências que vimos até agora são funções ou classes fixas.

Mas podem ocorrer casos onde você deseja ser capaz de definir parâmetros na dependência, sem ter a necessidade de declarar diversas funções ou classes.

Vamos imaginar que queremos ter uma dependência que verifica se o parâmetro de consulta q possui um valor fixo.

Porém nós queremos poder parametrizar o conteúdo fixo.

Uma instância "chamável"

Em Python existe uma maneira de fazer com que uma instância de uma classe seja um "chamável".

Não propriamente a classe (que já é um chamável), mas a instância desta classe.

Para fazer isso, nós declaramos o método __call__:

{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[12] *}

Neste caso, o __call__ é o que o FastAPI utilizará para verificar parâmetros adicionais e sub dependências, e isso é o que será chamado para passar o valor ao parâmetro na sua função de operação de rota posteriormente.

Parametrizar a instância

E agora, nós podemos utilizar o __init__ para declarar os parâmetros da instância que podemos utilizar para "parametrizar" a dependência:

{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[9] *}

Neste caso, o FastAPI nunca tocará ou se importará com o __init__, nós vamos utilizar diretamente em nosso código.

Crie uma instância

Nós poderíamos criar uma instância desta classe com:

{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[18] *}

E deste modo nós podemos "parametrizar" a nossa dependência, que agora possui "bar" dentro dele, como o atributo checker.fixed_content.

Utilize a instância como dependência

Então, nós podemos utilizar este checker em um Depends(checker), no lugar de Depends(FixedContentQueryChecker), porque a dependência é a instância, checker, e não a própria classe.

E quando a dependência for resolvida, o FastAPI chamará este checker como:

checker(q="somequery")

...e passar o que quer que isso retorne como valor da dependência em nossa função de operação de rota como o parâmetro fixed_content_included:

{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[22] *}

/// tip | Dica

Tudo isso parece não ser natural. E pode não estar muito claro ou aparentar ser útil ainda.

Estes exemplos são intencionalmente simples, porém mostram como tudo funciona.

Nos capítulos sobre segurança, existem funções utilitárias que são implementadas desta maneira.

Se você entendeu tudo isso, você já sabe como essas funções utilitárias para segurança funcionam por debaixo dos panos.

///