|
| 1 | +# Modelos de Formulários |
| 2 | + |
| 3 | +Você pode utilizar **Modelos Pydantic** para declarar **campos de formulários** no FastAPI. |
| 4 | + |
| 5 | +/// info | "Informação" |
| 6 | + |
| 7 | +Para utilizar formulários, instale primeiramente o <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>. |
| 8 | + |
| 9 | +Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo, e então instalar. Por exemplo: |
| 10 | + |
| 11 | +```console |
| 12 | +$ pip install python-multipart |
| 13 | +``` |
| 14 | + |
| 15 | +/// |
| 16 | + |
| 17 | +/// note | "Nota" |
| 18 | + |
| 19 | +Isto é suportado desde a versão `0.113.0` do FastAPI. 🤓 |
| 20 | + |
| 21 | +/// |
| 22 | + |
| 23 | +## Modelos Pydantic para Formulários |
| 24 | + |
| 25 | +Você precisa apenas declarar um **modelo Pydantic** com os campos que deseja receber como **campos de formulários**, e então declarar o parâmetro como um `Form`: |
| 26 | + |
| 27 | +//// tab | Python 3.9+ |
| 28 | + |
| 29 | +```Python hl_lines="9-11 15" |
| 30 | +{!> ../../../docs_src/request_form_models/tutorial001_an_py39.py!} |
| 31 | +``` |
| 32 | + |
| 33 | +//// |
| 34 | + |
| 35 | +//// tab | Python 3.8+ |
| 36 | + |
| 37 | +```Python hl_lines="8-10 14" |
| 38 | +{!> ../../../docs_src/request_form_models/tutorial001_an.py!} |
| 39 | +``` |
| 40 | + |
| 41 | +//// |
| 42 | + |
| 43 | +//// tab | Python 3.8+ non-Annotated |
| 44 | + |
| 45 | +/// tip | "Dica" |
| 46 | + |
| 47 | +Prefira utilizar a versão `Annotated` se possível. |
| 48 | + |
| 49 | +/// |
| 50 | + |
| 51 | +```Python hl_lines="7-9 13" |
| 52 | +{!> ../../../docs_src/request_form_models/tutorial001.py!} |
| 53 | +``` |
| 54 | + |
| 55 | +//// |
| 56 | + |
| 57 | +O **FastAPI** irá **extrair** as informações para **cada campo** dos **dados do formulário** na requisição e dar para você o modelo Pydantic que você definiu. |
| 58 | + |
| 59 | +## Confira os Documentos |
| 60 | + |
| 61 | +Você pode verificar na UI de documentação em `/docs`: |
| 62 | + |
| 63 | +<div class="screenshot"> |
| 64 | +<img src="/img/tutorial/request-form-models/image01.png"> |
| 65 | +</div> |
| 66 | + |
| 67 | +## Proibir Campos Extras de Formulários |
| 68 | + |
| 69 | +Em alguns casos de uso especiais (provavelmente não muito comum), você pode desejar **restringir** os campos do formulário para aceitar apenas os declarados no modelo Pydantic. E **proibir** qualquer campo **extra**. |
| 70 | + |
| 71 | +/// note | "Nota" |
| 72 | + |
| 73 | +Isso é suportado deste a versão `0.114.0` do FastAPI. 🤓 |
| 74 | + |
| 75 | +/// |
| 76 | + |
| 77 | +Você pode utilizar a configuração de modelo do Pydantic para `proibir` qualquer campo `extra`: |
| 78 | + |
| 79 | +//// tab | Python 3.9+ |
| 80 | + |
| 81 | +```Python hl_lines="12" |
| 82 | +{!> ../../../docs_src/request_form_models/tutorial002_an_py39.py!} |
| 83 | +``` |
| 84 | + |
| 85 | +//// |
| 86 | + |
| 87 | +//// tab | Python 3.8+ |
| 88 | + |
| 89 | +```Python hl_lines="11" |
| 90 | +{!> ../../../docs_src/request_form_models/tutorial002_an.py!} |
| 91 | +``` |
| 92 | + |
| 93 | +//// |
| 94 | + |
| 95 | +//// tab | Python 3.8+ non-Annotated |
| 96 | + |
| 97 | +/// tip |
| 98 | + |
| 99 | +Prefira utilizar a versão `Annotated` se possível. |
| 100 | + |
| 101 | +/// |
| 102 | + |
| 103 | +```Python hl_lines="10" |
| 104 | +{!> ../../../docs_src/request_form_models/tutorial002.py!} |
| 105 | +``` |
| 106 | + |
| 107 | +//// |
| 108 | + |
| 109 | +Caso um cliente tente enviar informações adicionais, ele receberá um retorno de **erro**. |
| 110 | + |
| 111 | +Por exemplo, se o cliente tentar enviar os campos de formulário: |
| 112 | + |
| 113 | +* `username`: `Rick` |
| 114 | +* `password`: `Portal Gun` |
| 115 | +* `extra`: `Mr. Poopybutthole` |
| 116 | + |
| 117 | +Ele receberá um retorno de erro informando-o que o campo `extra` não é permitido: |
| 118 | + |
| 119 | +```json |
| 120 | +{ |
| 121 | + "detail": [ |
| 122 | + { |
| 123 | + "type": "extra_forbidden", |
| 124 | + "loc": ["body", "extra"], |
| 125 | + "msg": "Extra inputs are not permitted", |
| 126 | + "input": "Mr. Poopybutthole" |
| 127 | + } |
| 128 | + ] |
| 129 | +} |
| 130 | +``` |
| 131 | + |
| 132 | +## Resumo |
| 133 | + |
| 134 | +Você pode utilizar modelos Pydantic para declarar campos de formulários no FastAPI. 😎 |
0 commit comments