Skip to content

Commit

Permalink
Deployed a155c4d with MkDocs version: 1.5.3
Browse files Browse the repository at this point in the history
  • Loading branch information
dunossauro committed Jan 13, 2024
1 parent 3a64084 commit fdedd22
Show file tree
Hide file tree
Showing 16 changed files with 129 additions and 155 deletions.
40 changes: 18 additions & 22 deletions 01/index.html

Large diffs are not rendered by default.

28 changes: 12 additions & 16 deletions 02/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@


<link rel="icon" href="../assets/logo.svg">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.2">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.3">



Expand Down Expand Up @@ -1147,7 +1147,7 @@
<details class="tip">
<summary>Caso prefira ver a aula em vídeo</summary>
<p>Esse aula ainda não está disponível em formato de vídeo, somente em texto!</p>
<p><a class="glightbox" href="https://www.youtube.com/embed/u31qwQUeGuM" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/u31qwQUeGuM" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<p><a class="glightbox" href="https://www.youtube.com/embed/u31qwQUeGuM" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/u31qwQUeGuM" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
</details>
<p><a class="md-button" href="#">Aula <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 576 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path></svg></span></a>
<a class="md-button" href="https://github.com/dunossauro/fastapi-do-zero/blob/main/slides/pdf/aula_02.pdf">Slides <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 384 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M64 0C28.7 0 0 28.7 0 64v384c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V160H256c-17.7 0-32-14.3-32-32V0H64zm192 0v128h128L256 0zM136 240h68c42 0 76 34 76 76s-34 76-76 76h-44v32c0 13.3-10.7 24-24 24s-24-10.7-24-24V264c0-13.3 10.7-24 24-24zm68 104c15.5 0 28-12.5 28-28s-12.5-28-28-28h-44v56h44z"></path></svg></span></a>
Expand Down Expand Up @@ -1220,7 +1220,7 @@ <h2 id="pydantic-e-a-validacao-de-dados">Pydantic e a validação de dados</h2>
<details class="tip">
<summary>Caso esse seja seu primeiro contato com Pydantic</summary>
<p>Temos uma live de python exclusiva sobre esse assunto</p>
<p><a class="glightbox" href="https://www.youtube.com/embed/UdfLu1G47BU" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/UdfLu1G47BU" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<p><a class="glightbox" href="https://www.youtube.com/embed/UdfLu1G47BU" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/UdfLu1G47BU" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<p><a class="md-button" href="https://www.youtube.com/watch?v=UdfLu1G47BU"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 576 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path></svg></span> Link direto</a></p>
</details>
<p>O Pydantic é uma biblioteca Python que oferece validação de dados e configurações usando anotações de tipos Python. Ela é utilizada extensivamente com o FastAPI para lidar com a validação e serialização/desserialização de dados. O Pydantic tem um papel crucial ao trabalhar com JSON, permitindo a validação dos dados recebidos neste formato, assim como sua conversão para formatos nativos do Python e vice-versa.</p>
Expand Down Expand Up @@ -1300,11 +1300,11 @@ <h3 id="implementando-a-rota-post">Implementando a Rota POST</h3>
<div class="language-shell highlight"><span class="filename">$ Execução no terminal!</span><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>task<span class="w"> </span>run
</span></code></pre></div>
<p>E acessar a página <a href="http://localhost:8000/docs">http://localhost:8000/docs</a>. Isso nos mostrará as definições do nosso endpoint usando o Swagger.</p>
<p><a class="glightbox" href="../assets/02_swagger.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_swagger.png"></a></p>
<p><a class="glightbox" href="../assets/02_swagger.png" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_swagger.png"></a></p>
<p>Dessa forma, podemos testar de forma simplificada a nossa API, enviando o JSON e realizando alguns testes.</p>
<p><a class="glightbox" href="../assets/02_swagger_com_request.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_swagger_com_request.png"></a></p>
<p><a class="glightbox" href="../assets/02_swagger_com_request.png" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_swagger_com_request.png"></a></p>
<p>Entretanto, precisamos prestar atenção a um detalhe: nosso modelo retorna a senha do usuário, o que é uma péssima prática de segurança.</p>
<p><a class="glightbox" href="../assets/02_respsota_do_swagger.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_respsota_do_swagger.png"></a></p>
<p><a class="glightbox" href="../assets/02_respsota_do_swagger.png" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_respsota_do_swagger.png"></a></p>
<p>Para evitar isso, podemos criar um novo modelo que será usado somente para resposta. Dessa forma, não expomos os dados que não queremos na API:</p>
<div class="language-python highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">fast_zero/schemas.py</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-7-10">10</a></span>
<span class="normal"><a href="#__codelineno-7-11">11</a></span>
Expand All @@ -1323,11 +1323,11 @@ <h3 id="implementando-a-rota-post">Implementando a Rota POST</h3>
</span></code></pre></div>
<p>Note que somente adicionando o <code>response_model</code>, o FastAPI já faz a conversão de <code>UserSchema</code> em <code>UserPublic</code></p>
<p>Agora, se fizermos de novo a chamada no Swagger, receberemos o mesmo objeto, mas sem expor a senha.</p>
<p><a class="glightbox" href="../assets/02_swagger_sem_senha.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_swagger_sem_senha.png"></a></p>
<p><a class="glightbox" href="../assets/02_swagger_sem_senha.png" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_swagger_sem_senha.png"></a></p>
<details class="tip">
<summary>Caso nunca tenha usado o Swagger</summary>
<p>Temos uma live focada em OpenAPI, que são as especificações do Swagger
<a class="glightbox" href="https://www.youtube.com/embed/TfGHNBaK9a0" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/TfGHNBaK9a0" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<a class="glightbox" href="https://www.youtube.com/embed/TfGHNBaK9a0" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/TfGHNBaK9a0" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<p><a class="md-button" href="https://youtu.be/TfGHNBaK9a0"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 576 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path></svg></span> Link direto</a></p>
</details>
<h4 id="criando-um-banco-de-dados-falso">Criando um banco de dados falso</h4>
Expand Down Expand Up @@ -1383,7 +1383,7 @@ <h4 id="implementando-o-teste-da-rota-post">Implementando o teste da rota POST</
</span><span id="__span-11-14"><a id="__codelineno-11-14" name="__codelineno-11-14" href="#__codelineno-11-14"></a><span class="c1"># parte da resposta foi omitida</span>
</span></code></pre></div>
<p>Vemos que temos 3 Miss. Possivelmente das linhas que acabamos de escrever.</p>
<p><a class="glightbox" href="../assets/02_cobertura_get_sem_testes.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_cobertura_get_sem_testes.png"></a></p>
<p><a class="glightbox" href="../assets/02_cobertura_get_sem_testes.png" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><img alt="descrição" class="center shadow" src="../assets/02_cobertura_get_sem_testes.png"></a></p>
<p>Então, vamos escrever nosso teste. Esse teste para a rota POST precisa verificar se a criação de um novo usuário funciona corretamente. Enviamos uma solicitação POST com um novo usuário para a rota /users/. Em seguida, verificamos se a resposta tem o status HTTP 201 (Criado) e se a resposta contém o novo usuário criado.</p>
<div class="language-python highlight"><span class="filename">tests/test_app.py</span><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="k">def</span> <span class="nf">test_create_user</span><span class="p">():</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a> <span class="n">client</span> <span class="o">=</span> <span class="n">TestClient</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
Expand Down Expand Up @@ -1428,7 +1428,7 @@ <h4 id="nao-se-repita-dry">Não se repita (DRY)</h4>
<details class="info">
<summary>Se fixtures são uma novidade para você</summary>
<p>Existe uma live de Python onde discutimos especificamente sobre fixtures
<a class="glightbox" href="https://www.youtube.com/embed/sidi9Z_IkLU" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/sidi9Z_IkLU" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<a class="glightbox" href="https://www.youtube.com/embed/sidi9Z_IkLU" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><div class="video-container"><iframe src="https://www.youtube.com/embed/sidi9Z_IkLU" style="position:relative;width:100%;height:22.172vw" frameborder="0" allowfullscreen alt="type:video"></iframe></div></a></p>
<p><a class="md-button" href="https://youtu.be/sidi9Z_IkLU"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 576 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path></svg></span> Link direto </a></p>
</details>
<p>Neste caso, criaremos uma fixture que retorna nosso <code>client</code>. Para fazer isso, precisamos criar o arquivo <code>tests/conftest.py</code>. O arquivo <code>conftest.py</code> é um arquivo especial reconhecido pelo pytest que permite definir fixtures que podem ser reutilizadas em diferentes módulos de teste em um projeto. É uma forma de centralizar recursos comuns de teste.</p>
Expand Down Expand Up @@ -1649,19 +1649,15 @@ <h2 id="conclusao">Conclusão</h2>




<span class="md-source-file__fact">
<span class="md-icon" title="Contribuidores">

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 5.5A3.5 3.5 0 0 1 15.5 9a3.5 3.5 0 0 1-3.5 3.5A3.5 3.5 0 0 1 8.5 9 3.5 3.5 0 0 1 12 5.5M5 8c.56 0 1.08.15 1.53.42-.15 1.43.27 2.85 1.13 3.96C7.16 13.34 6.16 14 5 14a3 3 0 0 1-3-3 3 3 0 0 1 3-3m14 0a3 3 0 0 1 3 3 3 3 0 0 1-3 3c-1.16 0-2.16-.66-2.66-1.62a5.536 5.536 0 0 0 1.13-3.96c.45-.27.97-.42 1.53-.42M5.5 18.25c0-2.07 2.91-3.75 6.5-3.75s6.5 1.68 6.5 3.75V20h-13v-1.75M0 20v-1.5c0-1.39 1.89-2.56 4.45-2.9-.59.68-.95 1.62-.95 2.65V20H0m24 0h-3.5v-1.75c0-1.03-.36-1.97-.95-2.65 2.56.34 4.45 1.51 4.45 2.9V20Z"/></svg>

</span>
<nav>

<a href="mailto:[email protected]">dunossauro</a>,
<a href="mailto:[email protected]">Julio Formiga</a>,
<a href="mailto:[email protected]">Rodrigo Vieira</a>,
<a href="mailto:[email protected]">Ricardo Emanuel</a>,
<a href="mailto:[email protected]">Bruna Ferreira</a>
dunossauro, Julio Formiga, Rodrigo Vieira, Ricardo Emanuel, Bruna Ferreira
</nav>
</span>

Expand Down
Loading

0 comments on commit fdedd22

Please sign in to comment.