<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on João Senger</title>
    <link>/posts/</link>
    <description>João Senger (Posts)</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>pt-BR</language>
    <managingEditor>joaosenger.dev@gmail.com (João Senger)</managingEditor>
    <webMaster>joaosenger.dev@gmail.com (João Senger)</webMaster>
    <lastBuildDate>Thu, 19 Mar 2026 12:10:33 -0300</lastBuildDate>
    
    <atom:link href="/posts/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Docker - Comandos Basicos</title>
      <link>/posts/docker-comandos-basicos/</link>
      <pubDate>Thu, 19 Mar 2026 12:10:33 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/docker-comandos-basicos/</guid>
      <description>&lt;p&gt;Conheça os principais comandos do Docker que utilizamos praticamente todos os dias.&lt;/p&gt;
&lt;h2 id=&#34;introdução&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#introdu%c3%a7%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Introdução
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;O Docker é a ferramenta mais utilizada para gerenciamento de containers atualmente. Uma das coisas que chamam a atenção ao começar a estudar Docker é que seus comandos seguem uma lógica, que se bem estudada facilita o entendimento de como gerenciar melhor nossos containers.&lt;/p&gt;
&lt;h2 id=&#34;entendo-o-padrão&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#entendo-o-padr%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Entendo o padrão
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Praticamente todos os comandos do Docker seguem o mesmo padrão:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker OBJETO AÇÃO [opções]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Onde:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objeto&lt;/strong&gt; é o que queremos gerenciar, por exemplo: imagens, redes, volumes, etc&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ação&lt;/strong&gt; é o verbo, o que queremos fazer, por exemplo: ls, rm, run, inspect, start, stop, etc&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opções&lt;/strong&gt; são auxiliares dos comandos, por exemplo, o comando &lt;strong&gt;&lt;code&gt;docker container ls&lt;/code&gt;&lt;/strong&gt; lista os containers &lt;strong&gt;em execução&lt;/strong&gt;, porém, se adicionarmos a opção (ou flag) &lt;code&gt;-a&lt;/code&gt; a saída do comando irá listar todos os containers, inclusive os que estão &lt;strong&gt;parados&lt;/strong&gt;, exemplo: &lt;strong&gt;&lt;code&gt;docker container ls -a&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;comandos-de-containers&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#comandos-de-containers&#34;&gt;
        #
    &lt;/a&gt;
    Comandos de containers
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Containers são as instancias em execucao criadas a partir de uma imagem. No dia a dia, estes são os comandos mais usados:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Lista containers em execucao&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Lista todos os containers (inclusive parados)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container ls -a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Cria e inicia um container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container run -d --name meu-nginx -p 8080:80 nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Para um container em execucao&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container stop meu-nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Inicia um container parado&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container start meu-nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Remove um container parado&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container rm meu-nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Mostra detalhes tecnicos de um container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container inspect meu-nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Exibe logs do container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container logs meu-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Atalhos equivalentes muito comuns:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker ps        &lt;span style=&#34;color:#78787e&#34;&gt;# equivale a docker container ls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rm &amp;lt;id&amp;gt;   &lt;span style=&#34;color:#78787e&#34;&gt;# equivale a docker container rm &amp;lt;id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;comandos-de-imagens&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#comandos-de-imagens&#34;&gt;
        #
    &lt;/a&gt;
    Comandos de imagens
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Imagens são os &amp;ldquo;moldes&amp;rdquo; usados para criar containers. Também seguem o mesmo padrão:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Lista imagens locais&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Baixa uma imagem do registry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image pull nginx:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Constroi uma imagem a partir de um Dockerfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image build -t minha-api:1.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Remove uma imagem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image rm nginx:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Mostra histórico de camadas de uma imagem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image &lt;span style=&#34;color:#ff5c57&#34;&gt;history&lt;/span&gt; nginx:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Mostra detalhes técnicos da imagem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image inspect nginx:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Atalhos equivalentes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker images          &lt;span style=&#34;color:#78787e&#34;&gt;# equivale a docker image ls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rmi &amp;lt;imagem&amp;gt;    &lt;span style=&#34;color:#78787e&#34;&gt;# equivale a docker image rm &amp;lt;imagem&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;comandos-de-volumes-e-redes&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#comandos-de-volumes-e-redes&#34;&gt;
        #
    &lt;/a&gt;
    Comandos de volumes e redes
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Volumes e redes sao recursos de apoio muito importantes para persistencia de dados e comunicacao entre containers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Volumes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker volume ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker volume create dados-app
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker volume inspect dados-app
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker volume rm dados-app
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Redes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network create minha-rede
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network inspect minha-rede
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network rm minha-rede
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;comandos-de-limpeza&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#comandos-de-limpeza&#34;&gt;
        #
    &lt;/a&gt;
    Comandos de limpeza
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Com o tempo, sobram recursos não usados no ambiente. Estes comandos ajudam na manutenção:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Remove containers parados&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container prune
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Remove imagens sem uso&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker image prune
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Remove volumes nao utilizados&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker volume prune
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Remove redes nao utilizadas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network prune
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Limpeza geral (use com cuidado)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker system prune -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;fluxo-pratico-no-dia-a-dia&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#fluxo-pratico-no-dia-a-dia&#34;&gt;
        #
    &lt;/a&gt;
    Fluxo pratico no dia a dia
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Um fluxo simples e comum:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ver o que esta rodando: &lt;code&gt;docker container ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ver recursos locais: &lt;code&gt;docker image ls&lt;/code&gt;, &lt;code&gt;docker volume ls&lt;/code&gt;, &lt;code&gt;docker network ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Subir um servico: &lt;code&gt;docker container run ...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Validar logs e estado: &lt;code&gt;docker container logs ...&lt;/code&gt; e &lt;code&gt;docker container inspect ...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Encerrar e limpar quando necessario: &lt;code&gt;docker container stop&lt;/code&gt;, &lt;code&gt;docker container rm&lt;/code&gt;, &lt;code&gt;docker * prune&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;conclusão&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#conclus%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Conclusão
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Quando você entende o padrão &lt;code&gt;docker OBJETO ACAO [opcoes]&lt;/code&gt;, aprender novos comandos fica muito mais fácil. Em vez de decorar tudo, você passa a raciocinar sobre o que deseja gerenciar e qual ação deseja executar.&lt;/p&gt;
&lt;p&gt;Esse padrao vale para praticamente todo o ecossistema Docker e acelera muito o trabalho no dia a dia.&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;en&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>Docker - Container parando após fechar a sessão SSH</title>
      <link>/posts/docker-container-encerrando-apos-sair-da-sessao-sh-ec2/</link>
      <pubDate>Wed, 19 Mar 2025 13:20:56 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/docker-container-encerrando-apos-sair-da-sessao-sh-ec2/</guid>
      <description>&lt;p&gt;Ao encerrar a sessão SSH com o servidor, seu container para? Entenda o que pode estar acontecendo.&lt;/p&gt;
&lt;h2 id=&#34;introdução&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#introdu%c3%a7%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Introdução
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;o-problema&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#o-problema&#34;&gt;
        ##
    &lt;/a&gt;
    O Problema
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Recentemente tive que subir um ambiente bem simples na AWS, era uma aplicação com dois containers que eram executados pelo &lt;code&gt;Docker Compose&lt;/code&gt;. Porém, uma coisa estranha estava acontecendo: ao encerrar a sessão ssh com o servidor os containers imediatamente ficavam indisponíveis.&lt;/p&gt;
&lt;h2 id=&#34;investigando-o-problema&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#investigando-o-problema&#34;&gt;
        #
    &lt;/a&gt;
    Investigando o problema
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;docker-logs&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#docker-logs&#34;&gt;
        ##
    &lt;/a&gt;
    Docker Logs
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Uma das primeiras coisas que eu faço para investigar uma parada inesperada de um container é analisar seus logs, isso pode ser facilmente analisado através do comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker logs container_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ao analisar os logs, percebi o seguinte erro:
&lt;code&gt;[Tue Mar 18 19:13:05.229898 2025] [mpm_prefork:notice] [pid 1:tid 1] AH00169: caught SIGTERM, shutting down&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ao bater o olho, percebi que a ação de me desconectar do servidor estava desligando os containers, através de um comando &lt;code&gt;SIGTERM&lt;/code&gt;, que basicamente é um comando &lt;code&gt;kill&lt;/code&gt; para parar um processo.&lt;/p&gt;
&lt;h3 id=&#34;buscando-uma-solução&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#buscando-uma-solu%c3%a7%c3%a3o&#34;&gt;
        ##
    &lt;/a&gt;
    Buscando uma solução
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Ao pesquisar na internet sobre o problema eu descobri que usuários que executavam o Docker como usuários comuns e não como &lt;code&gt;root&lt;/code&gt; enfrentavam esse problema, o que faz sentido. Quando um usuário faz logout todos os seus processos são encerrados, ou seja, ao fechar a conexão ssh todos os processos eram encerrados. Importante: eu estava usando o usuário &lt;code&gt;ubuntu&lt;/code&gt;, que é criado pelo EC2 ao criar uma VM com AMI Ubuntu. Para resolver o problema eu precisaria fazer algo para que os processos não fossem encerrados, essa seria a minha solução.&lt;/p&gt;
&lt;h2 id=&#34;aplicando-a-solução&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#aplicando-a-solu%c3%a7%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Aplicando a solução
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;linger&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#linger&#34;&gt;
        ##
    &lt;/a&gt;
    Linger
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Basicamente, esse carinha faz com que os processos do usuário continuem em execução após o logout.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Faz os processos continuarem em execução&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo loginctl enable-linger &lt;span style=&#34;color:#ff6ac1&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#ff6ac1&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# Faz o Docker ser iniciado automaticamente para o usuário atual&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl --user &lt;span style=&#34;color:#ff5c57&#34;&gt;enable&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Após isso, pausei as aplicações com o comando &lt;code&gt;docker-compose down&lt;/code&gt; e subi novamente com &lt;code&gt;docker-compose up -d&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Após isso, problema resolvido. 😁&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;pt&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>Entenda: GNU, Linux, FSF e GPL</title>
      <link>/posts/linux-entendendo-gnu-fsf-gpl/</link>
      <pubDate>Tue, 11 Mar 2025 20:30:44 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/linux-entendendo-gnu-fsf-gpl/</guid>
      <description>&lt;p&gt;Entenda o que é o Projeto GNU, Linux, Free Software Foundation e a Licença GPL - GNU General Public License.&lt;/p&gt;
&lt;h2 id=&#34;gnulinux&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#gnulinux&#34;&gt;
        #
    &lt;/a&gt;
    GNU/Linux
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;breve-história-sobre-o-gnu&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#breve-hist%c3%b3ria-sobre-o-gnu&#34;&gt;
        ##
    &lt;/a&gt;
    Breve história sobre o GNU
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Na década de 1980, no &lt;a href=&#34;https://en.wikipedia.org/wiki/Massachusetts_Institute_of_Technology&#34; target=&#34;_blanket&#34;&gt;MIT&lt;/a&gt;, um nerd chamado &lt;a href=&#34;https://en.wikipedia.org/wiki/Richard_Matthew_Stallman&#34; target=&#34;_blanket&#34;&gt;Richard Stallman&lt;/a&gt; estava descontente com o desenvolvimento de softwares exclusivamente proprietários, onde os desenvolvedores e usuários não tinham liberdade para estudar o software.&lt;/p&gt;
&lt;p&gt;Em 1983 Stallman criou o &lt;a href=&#34;https://www.gnu.org/gnu/gnu-history.pt-br.html&#34; target=&#34;_blanket&#34;&gt;Projeto GNU&lt;/a&gt; (Gnu is Not Unix) com a ideia de um &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix&#34; target=&#34;_blanket&#34;&gt;Unix&lt;/a&gt; livre, sem as amarras que os softwares proprietários da época impunham, assim, ele e diversos programadores entusiastas da ideia de software livre começaram a desenvolver algumas das ferramentas que são utilizadas até hoje, como o compilador &lt;strong&gt;GCC&lt;/strong&gt;, o &lt;strong&gt;Bash&lt;/strong&gt; e muitos outros.&lt;/p&gt;
&lt;h3 id=&#34;o-surgimento-do-linux&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#o-surgimento-do-linux&#34;&gt;
        ##
    &lt;/a&gt;
    O Surgimento do Linux
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Enquanto o Projeto GNU avançava no desenvolvimento de um sistema operacional livre, faltava um componente essencial no sistema: um kernel livre. Kernel é o componente do sistema operacional responsável por &amp;ldquo;conversar&amp;rdquo; com o hardware, é a ponte que liga a parte &amp;ldquo;física&amp;rdquo; do computador com a &amp;ldquo;lógica&amp;rdquo;. O Projeto GNU estava desenvolvendo seu próprio kernel, chamado &lt;strong&gt;Hurd&lt;/strong&gt;, porém, seu progresso de desenvolvimento era lento.&lt;/p&gt;
&lt;p&gt;Em 1991 um estudante finlandês chamado &lt;a href=&#34;https://en.wikipedia.org/wiki/Linus_Torvalds&#34; target=&#34;_blanket&#34;&gt;Linus Torvalds&lt;/a&gt; começou a desenvolver seu próprio kernel como um hobby, seu objetivo era criar um sistema que fosse compatível com Unix, livre e que pudesse ser executado em computadores pessoais.&lt;/p&gt;
&lt;p&gt;Torvalds postou sua ideia em um fórum da época e convidou outros programadores para contribuir com o projeto. Assim, o kernel foi chamado de Linux (uma mistura de Linus + Unix).&lt;/p&gt;
&lt;h3 id=&#34;gnulinux-1&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#gnulinux-1&#34;&gt;
        ##
    &lt;/a&gt;
    GNU/Linux
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;A utilização das ferramentas do Projeto GNU com o kernel Linux resultou no hoje tão conhecido &lt;b&gt;GNU/Linux&lt;/b&gt;. Essa fusão só foi possível graças às características do software livre.&lt;/p&gt;
&lt;h2 id=&#34;free-software-foundation-e-gpl&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#free-software-foundation-e-gpl&#34;&gt;
        #
    &lt;/a&gt;
    Free Software Foundation e GPL
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;free-software-foundation&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#free-software-foundation&#34;&gt;
        ##
    &lt;/a&gt;
    Free Software Foundation
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;A &lt;a href=&#34;https://www.fsf.org/&#34; target=&#34;_blanket&#34;&gt;Free Software Foundation&lt;/a&gt; foi criada em 1985 por Richard Stallman com o objetivo de promover o software livre. A FSF trabalha para garantir que os programas possam ser usados, estudados, modificados e compartilhados livremente, sem restrições de empresas ou governos.&lt;/p&gt;
&lt;h3 id=&#34;licença-gpl---gnu-general-public-license&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#licen%c3%a7a-gpl---gnu-general-public-license&#34;&gt;
        ##
    &lt;/a&gt;
    Licença GPL - GNU General Public License
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Também criada por Stallman, a A &lt;a href=&#34;https://www.gnu.org/licenses/&#34; target=&#34;_blanket&#34;&gt;GNU Public License&lt;/a&gt;, GNU GPL ou somente GPL é uma licença de software idealizada para garantir quatro liberdades fundamentais aos usuários:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Liberdade para executar o programa&lt;/li&gt;
&lt;li&gt;Liberdade para estudar e modificar o código-fonte&lt;/li&gt;
&lt;li&gt;Liberdade para redistribuir cópias&lt;/li&gt;
&lt;li&gt;Liberdade para distribuir versões modificadas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O casamento entre o GNU e o Linux se deve muito pelo motivo de ambos compartilharem a filosofia de software livre e às licenças GPL que estão presentes em ambos softwares.&lt;/p&gt;
&lt;h2 id=&#34;conclusão&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#conclus%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Conclusão
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;O GNU/Linux é o sistema operacional que domina o mercado tech. Está presente em servidores, smartphones, smartwatches, geladeiras inteligentes e até mesmo em Marte, a bordo da Ingenuity.&lt;/p&gt;
&lt;p&gt;Sintetizando, GNU é um conjunto de ferramentas e utilitários projetados para criar um sistema operacional livre, baseado nos princípios Unix. Linux é um Kernel que dá vida às ferramentas GNU.&lt;/p&gt;
&lt;p&gt;GNU + Linux = Sistema Operacional completo.&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;pt&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>Django REST framework: API CRUD com Autenticação JWT</title>
      <link>/posts/django-rest-framework-api-crud-com-autenticacao-jwt/</link>
      <pubDate>Thu, 04 Jul 2024 21:46:06 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/django-rest-framework-api-crud-com-autenticacao-jwt/</guid>
      <description>&lt;p&gt;Aprenda a criar uma API REST profissional utilizando Django REST framework. Construa um CRUD completo com autenticação de usuários utilizando JWT.&lt;/p&gt;
&lt;h2 id=&#34;introdução&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#introdu%c3%a7%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Introdução
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;o-que-iremos-aprender&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#o-que-iremos-aprender&#34;&gt;
        ##
    &lt;/a&gt;
    O que iremos aprender?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Nosso projeto será criar uma API para gerenciar tarefas (To-Do). Utilizaremos usuários e permissões do Django para acessar os recursos da API, além de autenticação por JWT.&lt;/p&gt;
&lt;p&gt;O código do projeto pode ser encontrado &lt;a href=&#34;https://github.com/joaosenger/todo_api&#34; target=&#34;_blank&#34;&gt;neste link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Este artigo não é para desenvolvedores totalmente leigos, tópicos como &lt;code&gt;o que é um token JWT&lt;/code&gt;, &lt;code&gt;o que é uma API REST&lt;/code&gt; ou &lt;code&gt;o que é o protocolo HTTP&lt;/code&gt; não serão abordados.&lt;/p&gt;
&lt;h3 id=&#34;o-que-é-o-django-rest-framework&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#o-que-%c3%a9-o-django-rest-framework&#34;&gt;
        ##
    &lt;/a&gt;
    O que é o Django REST framework?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.django-rest-framework.org/&#34;&gt;Django REST framework&lt;/a&gt; é um kit de ferramentas para construir APIs Web dentro do ecossistema Django. Possui diversas implementações prontas, como Serializers, Views, autenticação e permissões.&lt;/p&gt;
&lt;h3 id=&#34;quais-os-benefícios-em-se-utilizar-um-framework-para-o-desenvolvimento&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#quais-os-benef%c3%adcios-em-se-utilizar-um-framework-para-o-desenvolvimento&#34;&gt;
        ##
    &lt;/a&gt;
    Quais os benefícios em se utilizar um Framework para o desenvolvimento?
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; proteção contra vulnerabilidades comuns, como SQL Injection, Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ORM (Object-Relational Mapping):&lt;/strong&gt; facilitando o trabalho com bancos de dados relacionais, permitindo manipular o banco de dados usando objetos prontos ao invés de queries SQL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comunidade:&lt;/strong&gt; desenvolvimento colaborativo, diversos programadores testam a ferramenta e contribuem para a evolução do framework&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rapidez no desenvolvimento:&lt;/strong&gt; funcionalidades prontas podem ser usadas para implementação rápida e segura de projetos&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manutenção:&lt;/strong&gt; código limpo e organizado garantem facilidade na manutenção e implementação de novas features&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Confiabilidade:&lt;/strong&gt; frameworks populares (como o DRF - Django REST framework) são amplamente utilizados e testados, reduzindo a probabilidade de bugs e falhas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pré-requisitos&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#pr%c3%a9-requisitos&#34;&gt;
        #
    &lt;/a&gt;
    Pré-requisitos
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;conhecimentos&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#conhecimentos&#34;&gt;
        ##
    &lt;/a&gt;
    Conhecimentos:
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Conhecimentos básicos sobre API REST&lt;/li&gt;
&lt;li&gt;Conhecimento básico em desenvolvimento web&lt;/li&gt;
&lt;li&gt;Python: conhecimentos básicos e orientação a objetos&lt;/li&gt;
&lt;li&gt;Conhecimento básico sobre o protocolo HTTP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;softwares&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#softwares&#34;&gt;
        ##
    &lt;/a&gt;
    Softwares:
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.8 ou superior&lt;/li&gt;
&lt;li&gt;Editor de código (recomendo o VSCode)&lt;/li&gt;
&lt;li&gt;Postman ou Insomnia (opcional)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuração-inicial&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#configura%c3%a7%c3%a3o-inicial&#34;&gt;
        #
    &lt;/a&gt;
    Configuração inicial
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Primeiro, vamos criar um ambiente virtual para o nosso projeto:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python -m venv venv
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff5c57&#34;&gt;source&lt;/span&gt; venv/bin/activate &lt;span style=&#34;color:#78787e&#34;&gt;# para usuários Linux/MacOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#5af78e&#34;&gt;\v&lt;/span&gt;env&lt;span style=&#34;color:#5af78e&#34;&gt;\S&lt;/span&gt;cripts&lt;span style=&#34;color:#5af78e&#34;&gt;\A&lt;/span&gt;ctivate.ps1 &lt;span style=&#34;color:#78787e&#34;&gt;# para usuários Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com o ambiente criado, vamos instalar o Django e o Django Rest Framework (DRF):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install django &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip install djangorestframework
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;iniciando-e-configurando-o-projeto&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#iniciando-e-configurando-o-projeto&#34;&gt;
        ##
    &lt;/a&gt;
    Iniciando e configurando o projeto
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Agora que temos nosso ambiente com o Django e o DRF instalados, vamos iniciar um novo projeto Django:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;django-admin startproject app .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos testar o nosso novo projeto rodando o comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py runserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ao acessar &lt;a href=&#34;http://127.0.0.1:8000/&#34; target=&#34;_blank&#34;&gt;http://127.0.0.1:8000/&lt;/a&gt; uma página de &amp;lsquo;welcome&amp;rsquo; do Django deverá ser exibida:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/django-startproject.png&#34; alt=&#34;Django-welcome&#34;&gt;&lt;/p&gt;
&lt;p&gt;Podemos parar o servidor pressionando &lt;code&gt;CTRL+C&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;criando-o-nosso-primeiro-aplicativo&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#criando-o-nosso-primeiro-aplicativo&#34;&gt;
        ##
    &lt;/a&gt;
    Criando o nosso primeiro aplicativo
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Com o nosso projeto Django criado, podemos criar um novo aplicativo, que será chamado de &lt;code&gt;todo_api&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py startapp todo_api
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; o nosso projeto se chama &lt;code&gt;app&lt;/code&gt; e nesse projeto temos uma aplicação chamada &lt;code&gt;todo_api&lt;/code&gt;, não confunda!&lt;/p&gt;
&lt;p&gt;Um novo diretório chamado &lt;code&gt;todo_api&lt;/code&gt; foi criado em nosso projeto. Precisamos inserir o Django REST framework e o nosso aplicativo nas configurações do nosso projeto &lt;code&gt;app&lt;/code&gt;, para isso, acesse o arquivo &lt;strong&gt;&lt;code&gt;app/settings.py&lt;/code&gt;&lt;/strong&gt; e adicione a &lt;code&gt;todo_api&lt;/code&gt; aos &lt;code&gt;INSTALLED_APPS&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# app/settings.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INSTALLED_APPS &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.admin&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.auth&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.contenttypes&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.sessions&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.messages&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.staticfiles&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;rest_framework&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todo_api&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora temos o nosso projeto e aplicativo configurados, podemos fazer a nossa primeira operação no banco de dados, que cria um banco SQLite e as tabelas iniciais do Django:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py migrate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;desenvolvimento-da-api&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#desenvolvimento-da-api&#34;&gt;
        #
    &lt;/a&gt;
    Desenvolvimento da API
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Com o projeto e a aplicação criados e configurados, podemos iniciar o desenvolvimento da API de fato.&lt;/p&gt;
&lt;p&gt;Começaremos o desenvolvimento do nosso Model, ou seja, o modelo da nossa API no banco de dados, que será simples.&lt;/p&gt;
&lt;h3 id=&#34;models-e-serializers&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#models-e-serializers&#34;&gt;
        ##
    &lt;/a&gt;
    Models e Serializers
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Nosso modelo terá apenas três campos: id, task e done, sendo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;id:&lt;/strong&gt; criado automaticamente pelo Django, não precisamos declará-lo (que facilidade!)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;task:&lt;/strong&gt; será o nome da nossa &amp;ldquo;tarefa&amp;rdquo;, será um dado do tipo &lt;code&gt;CharField&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;done:&lt;/strong&gt; será o status da nossa tarefa, será um &lt;code&gt;booleano&lt;/code&gt; (true/false)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abra o arquivo &lt;code&gt;todo_api/models.py&lt;/code&gt; e insira o seguinte código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo_api/models.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.db &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; models
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;Todo&lt;/span&gt;(models&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;Model):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    task &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; models&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;CharField(max_length&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ff9f43&#34;&gt;250&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    done &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; models&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;BooleanField()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff6ac1&#34;&gt;def&lt;/span&gt; __str__(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff6ac1&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;task
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O Django irá interpretar esse modelo e criará automaticamente a tabela no banco de dados conforme as nossas especificações, não precisamos nos preocupar com SQL, essa é uma das facilidades que o Django ORM nos traz.&lt;/p&gt;
&lt;p&gt;Para que o Django &amp;ldquo;leia&amp;rdquo; os arquivos &lt;code&gt;models&lt;/code&gt; do nosso projeto, precisamos rodar o comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py makemigrations
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Após isso, rodamos o comando &lt;code&gt;migrate&lt;/code&gt; para aplicar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py migrate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Uma tabela será criada no seu banco de dados local (SQLite) com o nome &lt;code&gt;todo_todo_api&lt;/code&gt;, ou seja: &lt;code&gt;nomemodel_nomeapp&lt;/code&gt;. Os campos &lt;strong&gt;id&lt;/strong&gt;, &lt;strong&gt;task&lt;/strong&gt; e &lt;strong&gt;done&lt;/strong&gt; também serão criados.&lt;/p&gt;
&lt;p&gt;O nosso modelo foi criado, porém, os dados da API devem trafegar em formato &lt;strong&gt;JSON&lt;/strong&gt;, e não no formato de objetos do banco de dados, para &amp;ldquo;serializar&amp;rdquo; os nossos dados de objeto para json, precisamos criar um &lt;strong&gt;serializer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Como tudo no Django é simples, essa funcionalidade já está pronta, basta utilizá-la!&lt;/p&gt;
&lt;p&gt;Crie um arquivo chamado &lt;code&gt;serializers.py&lt;/code&gt; dentro da sua app &lt;code&gt;todo_api&lt;/code&gt;: &lt;strong&gt;todo_api/serializers.py&lt;/strong&gt; e inseira o código abaixo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo_api/serializers.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; serializers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.models &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; Todo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoSerializer&lt;/span&gt;(serializers&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;ModelSerializer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fields &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;__all__&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Basicamente importamos o nosso Model &lt;code&gt;Todo&lt;/code&gt;, que é a representação dos nosso dados no banco de dados e utilizamos o &lt;code&gt;ModelSerializer&lt;/code&gt; do Django REST framework, que fará a serialização de forma automática. Também informamos que queremos serializar todos os campos com &lt;code&gt;fields = __all__&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;views-e-view-classes&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#views-e-view-classes&#34;&gt;
        ##
    &lt;/a&gt;
    Views e View Classes
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;O arquivo &lt;code&gt;todo_api/views.py&lt;/code&gt; é responsável pela regra de negócio da nossa API, aqui será implementa toda a lógica do nosso CRUD. Como a nossa API é simples, utilizaremos duas classes prontas do DRF para abstrair as operações, sendo elas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ListCreateAPIView&lt;/strong&gt;: responsável pelos verbos &lt;code&gt;GET&lt;/code&gt; e &lt;code&gt;POST&lt;/code&gt;, lista todas as tarefas e permite a criação de uma nova tarefa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RetrieveUpdateDestroyAPIView&lt;/strong&gt;: trabalha com os id&amp;rsquo;s das tarefas, aqui podemos utilizar todos os verbos http: &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;. Podemos listar, alterar ou deletar as tarefas de acordo com o seu id único.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dentro do arquivo &lt;code&gt;todo_api/views.py&lt;/code&gt; insira o código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo_api/views.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; generics
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.models &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; Todo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.serializers &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoCreateListView&lt;/span&gt;(generics&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;ListCreateAPIView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    queryset &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;objects&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    serializer_class &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoRetrieveUpdateDestroyView&lt;/span&gt;(generics&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;RetrieveUpdateDestroyAPIView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    queryset &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;objects&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    serializer_class &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Criamos duas classes, uma para cada View Class do DRF, agora, podemos configurar nossas URLs para enviar as requisições para as nossas views.&lt;/p&gt;
&lt;h2 id=&#34;urls-e-versionamento-da-api&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#urls-e-versionamento-da-api&#34;&gt;
        #
    &lt;/a&gt;
    URLs e Versionamento da API
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Dentro do diretório &lt;code&gt;todo_api&lt;/code&gt; crie um arquivo chamado &lt;code&gt;urls.py&lt;/code&gt; e insira o código abaixo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo_api/urls.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.urls &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; path
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; . &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; views
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;urlpatterns &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todos/&amp;#39;&lt;/span&gt;, views&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;TodoCreateListView&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;as_view(), name&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todo-create-list-view&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todos/&amp;lt;int:pk&amp;gt;&amp;#39;&lt;/span&gt;, views&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;TodoRetrieveUpdateDestroyView&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;as_view(), name&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todo-detail-view&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esse trecho de código informa que ao acessar a nossa api na rota &lt;strong&gt;/todos/&lt;/strong&gt; e &lt;strong&gt;/todos/id/&lt;/strong&gt; o Django deve utilizar a view configurada anteriormente.&lt;/p&gt;
&lt;p&gt;Não é uma boa prática acessar diretamente as rotas, a boa prática é utilizar o versionamento de urls, ou seja, antes de acessar o caminho &lt;strong&gt;/todos/&lt;/strong&gt;, por exemplo, acessamos &lt;strong&gt;/api/v1/todos/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Isso garante que em uma nova implementação, no caso uma v2, os clientes que utilizam o endpoint &lt;strong&gt;/v1/&lt;/strong&gt; não sejam afetados.&lt;/p&gt;
&lt;p&gt;Para implementar o versionamento, acesse o arquivo &lt;code&gt;app/urls.py&lt;/code&gt; e inseira o código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# app/urls.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.contrib &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.urls &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; path, include
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;urlpatterns &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;admin/&amp;#39;&lt;/span&gt;, admin&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;site&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;urls),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;api/v1/&amp;#39;&lt;/span&gt;, include(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todo_api.urls&amp;#39;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Utilizamos o &lt;strong&gt;include&lt;/strong&gt; do Django para criar um versionamento, agora, nossa api será acessada por: &lt;a href=&#34;http://127.0.0.1:8000/api/v1/todos/&#34; target=&#34;_blank&#34;&gt;http://127.0.0.1:8000/api/v1/todos/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;api-funcionando-primeiro-teste&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#api-funcionando-primeiro-teste&#34;&gt;
        ##
    &lt;/a&gt;
    API funcionando, primeiro teste!
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Nossa API já está funcional, podemos testá-la.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;py runserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Acesse &lt;a href=&#34;http://127.0.0.1:8000/api/v1/todos/&#34; target=&#34;_blank&#34;&gt;http://127.0.0.1:8000/api/v1/todos/&lt;/a&gt; e crie algumas tarefas.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/drf_post.png&#34; alt=&#34;drf-post&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ao acessar a url passando algum &lt;strong&gt;id&lt;/strong&gt;, podemos ver a &lt;code&gt;RetrieveUpdateDestroyAPIView&lt;/code&gt; em ação, com as opções de visualizar, alterar ou deletar um recurso específico.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/drf_retrieve_update_destroy.png&#34; alt=&#34;drf-get-put-delete&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;django-admin---criação-e-gerenciamento-de-usuários&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#django-admin---cria%c3%a7%c3%a3o-e-gerenciamento-de-usu%c3%a1rios&#34;&gt;
        ##
    &lt;/a&gt;
    Django ADMIN - Criação e gerenciamento de usuários
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;O Django já nos traz pronta uma plataforma para gerenciar usuários, grupos de usuários e Models do banco de dados.&lt;/p&gt;
&lt;p&gt;Para criar o primeiro usuário (root) digite no terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py createsuperuser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;img/django-createsuperuser.png&#34; alt=&#34;django-create-superuser&#34;&gt;&lt;/p&gt;
&lt;p&gt;Para adicionarmos nosso model no Django Admin, acesse o arquivo &lt;code&gt;todo_api/admin&lt;/code&gt; e insira o código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo_api/admin.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.contrib &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.models &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; Todo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff9f43&#34;&gt;@admin.register&lt;/span&gt;(Todo)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoAdmin&lt;/span&gt;(admin&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;ModelAdmin):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    list_display &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;task&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;done&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute o servidor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py runserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Acesse a url do django admin:
&lt;a href=&#34;http://127.0.0.1:8000/admin/&#34; target=&#34;_blank&#34;&gt;http://127.0.0.1:8000/admin/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/django-admin.png&#34; alt=&#34;django-admin&#34;&gt;&lt;/p&gt;
&lt;p&gt;Insira as suas credenciais e acesse a dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/django-admin-dashboard.png&#34; alt=&#34;django-dashboard&#34;&gt;&lt;/p&gt;
&lt;p&gt;Crie pelo menos um usuário, sem credenciais de admin para prosseguirmos.&lt;/p&gt;
&lt;h3 id=&#34;segurança---autenticação-com-jwt-e-proteção-dos-endpoints&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#seguran%c3%a7a---autentica%c3%a7%c3%a3o-com-jwt-e-prote%c3%a7%c3%a3o-dos-endpoints&#34;&gt;
        ##
    &lt;/a&gt;
    Segurança - Autenticação com JWT e proteção dos endpoints
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Com o nosso CRUD pronto e com o django admin fazendo o gerenciamento de usuários, podemos começar a autenticação da nossa API.&lt;/p&gt;
&lt;p&gt;Iremos exigir que apenas usuários autenticados tenham acesso à API, além de protegeremos os nossos endpoints, onde apenas usuários autenticados e com permissões poderão acessar a API e executar ações.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instale o Django REST framework Simple JWT&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install djangorestframework-simplejwt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Na configuração do projeto, &lt;code&gt;app/settings.py&lt;/code&gt; adicione o código abaixo no final do arquivo:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# app/settings.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;REST_FRAMEWORK &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;DEFAULT_AUTHENTICATION_CLASSES&amp;#39;&lt;/span&gt;: (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;rest_framework_simplejwt.authentication.JWTAuthentication&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SIMPLE_JWT &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;ACCESS_TOKEN_LIFETIME&amp;#34;&lt;/span&gt;: timedelta(days&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ff9f43&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;REFRESH_TOKEN_LIFETIME&amp;#34;&lt;/span&gt;: timedelta(days&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ff9f43&#34;&gt;7&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No começo do arquivo, importe o &lt;code&gt;timedelta&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; datetime &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; timedelta
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nesse código configuramos que a autenticação será feita pelo Simple JWT e qual será o tempo de vida do Token antes dele expirar.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Criando o endpoint para gerar o token&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Precisamos criar um endpoint para gerar o nosso token jwt. Criaremos um novo aplicativo para ser responsável pela autenticação:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python manage.py startapp authentication
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adicione o novo app no arquivo &lt;code&gt;app/settings.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INSTALLED_APPS &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.admin&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.auth&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.contenttypes&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.sessions&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.messages&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;django.contrib.staticfiles&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;rest_framework&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todo&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;authentication&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dentro dessa nova app, crie um arquivo chamado &lt;code&gt;urls.py&lt;/code&gt; e insira o código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# authentication/urls.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.urls &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; path
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework_simplejwt.views &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; TokenObtainPairView, TokenRefreshView, TokenVerifyView
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;urlpatterns &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;authentication/token/&amp;#39;&lt;/span&gt;, TokenObtainPairView&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;as_view(), name&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;token-obtain-pair-view&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;authentication/token/refresh/&amp;#39;&lt;/span&gt;, TokenRefreshView&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;as_view(), name&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;token-refresh-vier&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;authentication/token/verify&amp;#39;&lt;/span&gt;, TokenVerifyView&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;as_view(), name&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;token-verify-view&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Estamos criando endpoints para gerar o nosso token JWT, seu refresh e verify.&lt;/p&gt;
&lt;p&gt;Tudo isso é abstraido pelo DRF, não precisamos criar tudo na mão.&lt;/p&gt;
&lt;p&gt;Agora, no arquivo &lt;code&gt;app/urls.py&lt;/code&gt; vamos importar nossos novos endpoints, o código deverá ficar assim:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# app/urls.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.contrib &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; django.urls &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; path, include
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;urlpatterns &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;admin/&amp;#39;&lt;/span&gt;, admin&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;site&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;urls),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;api/v1/&amp;#39;&lt;/span&gt;, include(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;authentication.urls&amp;#39;&lt;/span&gt;)), &lt;span style=&#34;color:#78787e&#34;&gt;# endpoint para autenticação&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;api/v1/&amp;#39;&lt;/span&gt;, include(&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;todo_api.urls&amp;#39;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, vamos proteger nossas views. No arquivo &lt;code&gt;todo/views.py&lt;/code&gt; vamos adicionar &lt;code&gt;permission_classes&lt;/code&gt; em nossas rotas, esse é um recurso do DRF utilizado para proteger as rotas. O arquivo deverá ficar assim:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo/views.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; generics
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework.permissions &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; IsAuthenticated
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.models &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; Todo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.serializers &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoCreateListView&lt;/span&gt;(generics&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;ListCreateAPIView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    permission_classes &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; (IsAuthenticated, )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    queryset &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;objects&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    serializer_class &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoRetrieveUpdateDestroyView&lt;/span&gt;(generics&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;RetrieveUpdateDestroyAPIView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    permission_classes &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; (IsAuthenticated, )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    queryset &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;objects&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    serializer_class &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, ao tentar acessar algum recurso da nossa API, não será possível. Veja:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/drf-rota-protegida.png&#34; alt=&#34;drf-IsAuthenticated&#34;&gt;&lt;/p&gt;
&lt;p&gt;Para acessar, será necessário gerar um Token JWT na rota &lt;code&gt;api/v1/authentication/token/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A partir daqui, utilizaremos o Postman para fazer requisições à API, pois teremos que informar o token em nossas requisições.&lt;/p&gt;
&lt;p&gt;Acesse o Postman e faça uma requisição &lt;code&gt;POST&lt;/code&gt; na url &lt;code&gt;127.0.0.1:8000/api/v1/authentication/token/&lt;/code&gt; passando o username/password no corpo da requisição &lt;code&gt;body&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;username&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;yourusername&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;yourpassword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ao fazer a requisição informando o usuário e senha que você criou no Django Admin, será retornado um Access Token e um Verify Token, porém, nesse tutorial utilizaremos apenas o access token:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/drf-simplejwt.png&#34; alt=&#34;drf-simplejwt&#34;&gt;&lt;/p&gt;
&lt;p&gt;Copie o &lt;code&gt;access token&lt;/code&gt; e faça uma nova requisição na rota &lt;code&gt;127.0.0.1:8000/api/v1/todos&lt;/code&gt; passando o token copiado em &lt;code&gt;Authorization &amp;gt; Bearer Token&lt;/code&gt;, conforme imagem abaixo:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/drf-jwt-authenticated.png&#34; alt=&#34;drf-jwt-authenticated&#34;&gt;&lt;/p&gt;
&lt;p&gt;Com isso, apenas usuários autenticados podem acessar nossas tarefas. Mas, e se eu quiser que algum usuário tenha permissão apenas de leitura, mas não de alteração dos dados? ou seja, pode fazer um &lt;code&gt;GET&lt;/code&gt;, mas não um &lt;code&gt;PUT&lt;/code&gt;? Para resolver esse problema, utilizaremos as permissões de usuários.&lt;/p&gt;
&lt;h3 id=&#34;permissões-de-usuários&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#permiss%c3%b5es-de-usu%c3%a1rios&#34;&gt;
        ##
    &lt;/a&gt;
    Permissões de Usuários
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Nesse ponto apenas usuários autenticados podem utilizar a API, porém, queremos restringir o acessos desses usuários. Por exemplo, determinado usuário pode ter apenas permissão de leitura &lt;code&gt;GET&lt;/code&gt;, enquanto outro usuário pode ler e criar novas tarefas &lt;code&gt;GET&lt;/code&gt; e &lt;code&gt;POST&lt;/code&gt;, enquanto outro tipo de usuário pode fazer todas as ações. Para isso, utilizaremos as permissões de usuários do Django.&lt;/p&gt;
&lt;p&gt;Vamos criar dois exemplos, o primeiro será um grupo de usuários que apenas pode fazer &lt;code&gt;GET&lt;/code&gt; e o segundo com todas as permissões.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Acesse o Django Admin&lt;/li&gt;
&lt;li&gt;Clique em &amp;ldquo;Groups&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Crie um grupo chamado &lt;code&gt;&amp;quot;read_only&amp;quot;&lt;/code&gt; e dê a permissão &lt;code&gt;Todo_Api | todo | Can view todo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Salve&lt;/li&gt;
&lt;li&gt;Repita o processo, agora crie um crupo chamado &lt;code&gt;&amp;quot;full_access&amp;quot;&lt;/code&gt; e dê as permissões:
&lt;code&gt;Todo_Api | todo | Can view todo&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Todo_Api | todo | Can add todo&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Todo_Api | todo | Can delete todo&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Todo_Api | todo | Can change todo&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Exemplo de criação do grupo &amp;ldquo;full_access&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/django-admin-group.png&#34; alt=&#34;django-admin-group&#34;&gt;&lt;/p&gt;
&lt;p&gt;Agora temos dois grupos de usuários com permissões distintas, essa é a melhor prática para gerenciamento de permissões de usuários.&lt;/p&gt;
&lt;p&gt;Agora, precisamos informar no código que os usuários além de estarem autenticados devem ter permissão para executar as ações na API.&lt;/p&gt;
&lt;p&gt;Dentro de &lt;code&gt;app&lt;/code&gt; crie um arquivo chamado &lt;code&gt;permissions.py&lt;/code&gt; e insira o código abaixo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# app/permissions.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; permissions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;GlobalDefaultPermission&lt;/span&gt;(permissions&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;BasePermission):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff6ac1&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#57c7ff&#34;&gt;has_permission&lt;/span&gt;(self, request, view):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model_permission_codename &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;__get_model_permission_codename(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            method&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;request&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;method,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            view&lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt;view,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff6ac1&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ff6ac1&#34;&gt;not&lt;/span&gt; model_permission_codename:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ff6ac1&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ff6ac1&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff6ac1&#34;&gt;return&lt;/span&gt; request&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;user&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;has_perm(model_permission_codename)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff6ac1&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#57c7ff&#34;&gt;__get_model_permission_codename&lt;/span&gt;(self, method, view):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff6ac1&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            model_name &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; view&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;queryset&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;_meta&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;model_name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            app_label &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; view&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;queryset&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;_meta&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;app_label
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            action &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;__get_action_sufix(method)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ff6ac1&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#5af78e&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;{&lt;/span&gt;app_label&lt;span style=&#34;color:#5af78e&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;{&lt;/span&gt;action&lt;span style=&#34;color:#5af78e&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#5af78e&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff6ac1&#34;&gt;except&lt;/span&gt; AttributeError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ff6ac1&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ff6ac1&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff6ac1&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#57c7ff&#34;&gt;__get_action_sufix&lt;/span&gt;(self, method):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        method_actions &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;view&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;add&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;PUT&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;change&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;PATCH&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;change&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;DELETE&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;delete&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;OPTIONS&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;view&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;HEAD&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;view&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff6ac1&#34;&gt;return&lt;/span&gt; method_actions&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;get(method, &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esse código sobrescreve a função &lt;code&gt;has_permission&lt;/code&gt; herdada de &lt;code&gt;permissions.BasePermission&lt;/code&gt;. Essa função deve retornar &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;. O código verifica se o usuário tem permissão atrelada e retorna &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Por fim, vamos adicionar essa classe de permissões em nosso arquivo de &lt;code&gt;views&lt;/code&gt;. No arquivo &lt;code&gt;todo_api/views.py&lt;/code&gt; importe a classe &lt;code&gt;GlobalDefaultPermission&lt;/code&gt; criada anteriormente e a inclua nas &lt;code&gt;permission_classes&lt;/code&gt;. O código deverá ficar assim:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#78787e&#34;&gt;# todo_api/views.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; generics
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; rest_framework.permissions &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; IsAuthenticated
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.models &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; Todo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; todo_api.serializers &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;from&lt;/span&gt; app.permissions &lt;span style=&#34;color:#ff6ac1&#34;&gt;import&lt;/span&gt; GlobalDefaultPermission
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoCreateListView&lt;/span&gt;(generics&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;ListCreateAPIView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    permission_classes &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; (IsAuthenticated, GlobalDefaultPermission)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    queryset &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;objects&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    serializer_class &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff6ac1&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#f3f99d&#34;&gt;TodoRetrieveUpdateDestroyView&lt;/span&gt;(generics&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;RetrieveUpdateDestroyAPIView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    permission_classes &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; (IsAuthenticated, GlobalDefaultPermission)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    queryset &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; Todo&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;objects&lt;span style=&#34;color:#ff6ac1&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    serializer_class &lt;span style=&#34;color:#ff6ac1&#34;&gt;=&lt;/span&gt; TodoSerializer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;testes&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#testes&#34;&gt;
        #
    &lt;/a&gt;
    Testes
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;No Django Admin, crie um usuário e insira ele no grupo &lt;code&gt;read_only&lt;/code&gt;, ele funcionará normalmente, depois, tente cadastrar uma nova tarefa, você não terá permissão. Após isso, adicione o grupo &lt;code&gt;full_access&lt;/code&gt; no usuário e tente novamente, você conseguirá criar a tarefa.&lt;/p&gt;
&lt;p&gt;Exemplo de tentativa de acesso com um usuário sem permissão:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/sem_permissao.png&#34; alt=&#34;sem-permissao&#34;&gt;&lt;/p&gt;
&lt;p&gt;Agora com o usuário fazendo parte do grupo &lt;code&gt;read_only&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;img/com-permissao.png&#34; alt=&#34;sem-permissao&#34;&gt;&lt;/p&gt;
&lt;p&gt;Assim, nossa API está completa. Fazemos operações de CRUD com usuários autenticados e rotas protegidas.&lt;/p&gt;
&lt;h2 id=&#34;conclusão&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#conclus%c3%a3o&#34;&gt;
        #
    &lt;/a&gt;
    Conclusão
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Neste artigo aprendemos a utilizar o Django REST framework para criar uma API REST de forma simples, segura e profissional. O trabalho de um desenvolvedor Backend está muitas vezes atrelado a operações de CRUD no banco de dados, além de modelagem de dados e segurança da aplicação. Esta API não visa esgotar todas as melhores práticas de desenvolvimento, mas orientar desenvolvedores iniciantes sobre práticas utilizadas no mercado.&lt;/p&gt;
&lt;h2 id=&#34;próximos-passos&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#pr%c3%b3ximos-passos&#34;&gt;
        #
    &lt;/a&gt;
    Próximos passos
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Sempre podemos melhorar o nosso projeto, no futuro iremos implementar algumas funcionalidades, como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuração do linter Flake8 para padronização do código conforme a PEP 8&lt;/li&gt;
&lt;li&gt;Criar a documentação da API com Swagger&lt;/li&gt;
&lt;li&gt;Criar um Dockerfile para rodar a aplicação como um container&lt;/li&gt;
&lt;li&gt;Fazer o Deploy da API na AWS com uma Pipeline completa (CodeCommit + CodePipeline + CodeBuild + ECR + ECS com Fargate)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esses conteúdos serão publicados em breve aqui no blog.&lt;/p&gt;
&lt;p&gt;Aguardo vocês. 😁&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;pt&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>O que é Linux e o que são distribuições Linux</title>
      <link>/posts/o-que-e-linux-e-o-que-sao-distros-linux/</link>
      <pubDate>Tue, 11 Jun 2024 07:36:03 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/o-que-e-linux-e-o-que-sao-distros-linux/</guid>
      <description>&lt;p&gt;Entenda o que é Linux e o que são distribuições Linux de forma resumida e sucinta.&lt;/p&gt;
&lt;h2 id=&#34;o-que-é-linux&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#o-que-%c3%a9-linux&#34;&gt;
        #
    &lt;/a&gt;
    O que é Linux?
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Linux é um &lt;strong&gt;Kernel&lt;/strong&gt;, criado em 1991 por &lt;strong&gt;Linus Torvalds&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kernel&lt;/strong&gt; é o componente do sistema operacional responsável por &amp;ldquo;conversar&amp;rdquo; com o hardware, é a ponte que liga a parte &amp;ldquo;física&amp;rdquo; do computador com a &amp;ldquo;lógica&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;img/kernel.png&#34; alt=&#34;Kernel&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;distribuições-linux&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#distribui%c3%a7%c3%b5es-linux&#34;&gt;
        #
    &lt;/a&gt;
    Distribuições Linux
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;O Kernel é apenas uma parte de uma distribuição Linux, responsável pela comunicação do hardware com a camada de aplicações do sistema operacional. Por outro lado, uma distribuição Linux é a utilização do Kernel Linux com outras ferramentas, a fim de criar um sistema operacional usável, com interface, aplicativos, ferramentas administrativas e diversas outras funcionalidades.&lt;/p&gt;
&lt;p&gt;Alguns exemplos de distribuições Linux:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian&lt;/li&gt;
&lt;li&gt;RedHat&lt;/li&gt;
&lt;li&gt;openSUSE&lt;/li&gt;
&lt;li&gt;Slackware&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;finalizando&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#finalizando&#34;&gt;
        #
    &lt;/a&gt;
    Finalizando
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt; é o kernel, o núcleo do sistema. Ele faz a comunicação do hardware (CPU, Memória e Dispositivos) com a parte lógica do sistema (aplicações).&lt;/p&gt;
&lt;p&gt;Já uma &lt;strong&gt;Distribuição Linux&lt;/strong&gt; é uma coleção de softwares que usam o Kernel Linux, dando vida a um sistema operacional usável baseado no Kernel Linux.&lt;/p&gt;
&lt;p&gt;Vale a pena ressaltar que essa postagem não visa esgotar o entendimento do que é Linux e Distribuições Linux, é apenas uma visão geral de um tema muito amplo e discutido na comunidade.&lt;/p&gt;
&lt;h2 id=&#34;quer-saber-mais-sobre-o-tema&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#quer-saber-mais-sobre-o-tema&#34;&gt;
        #
    &lt;/a&gt;
    Quer saber mais sobre o tema?
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.redhat.com/pt-br/topics/linux&#34; target=&#34;_blank&#34;&gt;RedHat: conheça o Linux&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://learning.lpi.org/pt/learning-materials/010-160/1/1.1/1.1_01/&#34; target=&#34;_blank&#34;&gt;LPI: A evolução do Linux e sistemas operacionais populares&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://www.guiafoca.org/guiaonline/iniciante/&#34; target=&#34;_blank&#34;&gt;GuiaFoca Linux - Iniciante&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;pt&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>Como hospedar um site estático utilizando o Amazon S3</title>
      <link>/posts/como-hospedar-site-estatico-amazon-s3/</link>
      <pubDate>Tue, 11 Jun 2024 07:02:25 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/como-hospedar-site-estatico-amazon-s3/</guid>
      <description>&lt;p&gt;Aprenda a hospedar um site estático de forma simples utilizando o &lt;strong&gt;Amazon S3&lt;/strong&gt; da AWS.&lt;/p&gt;
&lt;h2 id=&#34;antes-de-mais-nada-o-que-é-o-amazon-s3&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#antes-de-mais-nada-o-que-%c3%a9-o-amazon-s3&#34;&gt;
        #
    &lt;/a&gt;
    Antes de mais nada, o que é o Amazon S3?
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;O &lt;strong&gt;Amazon Simple Storage Service (S3)&lt;/strong&gt; é o serviço de armazenamento de objetos da AWS que também pode ser utilizado para hospedagem de sites estáticos, ou seja, você não precisa subir o seu site em uma máquina virtual, instalar um Web Server como o Apache ou o NGINX, o Amazon S3 se encarrega de colocar o site no ar, você apenas deve fazer as configurações corretas, que veremos abaixo.&lt;/p&gt;
&lt;h2 id=&#34;crie-uma-conta-na-amazon-web-services-aws&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#crie-uma-conta-na-amazon-web-services-aws&#34;&gt;
        #
    &lt;/a&gt;
    Crie uma Conta na Amazon Web Services (AWS)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Se você ainda não possui uma conta na AWS, você precisará criar uma. Acesse &lt;a href=&#34;https://aws.amazon.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;aws.amazon.com&lt;/a&gt; e siga as instruções para se registrar. Você precisará fornecer informações de pagamento, mas fique tranquilo, ao criar a sua conta você ganha 12 meses de free-tier em alguns serviços, incluindo o S3, e os limites para uso do S3 são generosos.&lt;/p&gt;
&lt;br&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Free-tier? 12 meses gratuito?!&amp;rdquo;&lt;/strong&gt;&lt;br&gt;
Sim, o serviço Amazon S3 pode ser testado por 12 meses com limites interessantes para que possamos testar o serviço, para saber mais acesse a página do
&lt;a href=&#34;https://aws.amazon.com/pt/free/&#34; target=&#34;_blank&#34;&gt;Nível gratuito da AWS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;crie-um-bucket-no-amazon-s3&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#crie-um-bucket-no-amazon-s3&#34;&gt;
        #
    &lt;/a&gt;
    Crie um Bucket no Amazon S3
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Uma &amp;ldquo;bucket&amp;rdquo; é um recipiente de armazenamento no Amazon S3. Ele será usado para armazenar os arquivos do seu site. Siga estas etapas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Faça login no Console de Gerenciamento da AWS.&lt;/li&gt;
&lt;li&gt;No console, pesquise pelo nome &amp;ldquo;S3&amp;rdquo; e clique no serviço.&lt;/li&gt;
&lt;li&gt;Clique em &amp;ldquo;Criar bucket&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Escolha um nome exclusivo para o seu bucket e selecione uma região.&lt;/li&gt;
&lt;li&gt;Deixe as configurações padrão e clique em &amp;ldquo;Create bucket&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;É indicado selecionar a região mais próxima ao seu público, no caso de nós brasileiros é a &lt;code&gt;sa-east-1&lt;/code&gt;, que embora seja levemente mais cara em comparação às outras regiões da AWS, possui menor latência.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;configurar-as-opções-de-acesso&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#configurar-as-op%c3%a7%c3%b5es-de-acesso&#34;&gt;
        #
    &lt;/a&gt;
    Configurar as &amp;lsquo;Opções de Acesso&amp;rsquo;
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Para que o seu site seja acessível publicamente, você precisará configurar as permissões corretas no bucket. Siga estas etapas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No console do Amazon S3, selecione o bucket do seu site.&lt;/li&gt;
&lt;li&gt;Clique em &amp;ldquo;Permissões&amp;rdquo; e em &amp;ldquo;Bloquear acesso público (configurações do bucket)&amp;rdquo; clique em &amp;ldquo;Editar&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Desmarque a opção &amp;ldquo;Bloquear todo o acesso público&amp;rdquo; e clique em &amp;ldquo;Salvar alterações&amp;rdquo;. Confirme as alterações digitando &amp;ldquo;confirmar&amp;rdquo; e salve.&lt;/li&gt;
&lt;li&gt;Ainda em &amp;ldquo;Permissões&amp;rdquo;, vá em &amp;ldquo;Política do bucket&amp;rdquo; clique em &amp;ldquo;Editar&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Cole a política de bucket abaixo, substituindo &lt;code&gt;&amp;lt;seubucket&amp;gt;&lt;/code&gt; pelo nome do seu bucket:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Sid&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;PublicReadGetObject&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Principal&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;s3:GetObject&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ff6ac1&#34;&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#5af78e&#34;&gt;&amp;#34;arn:aws:s3:::&amp;lt;seubucket&amp;gt;/*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Clique em &amp;ldquo;Salvar alterações&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;configurar-a-bucket-para-hospedagem-de-site-estático&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#configurar-a-bucket-para-hospedagem-de-site-est%c3%a1tico&#34;&gt;
        #
    &lt;/a&gt;
    Configurar a Bucket para Hospedagem de Site Estático
&lt;/div&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Clique em &amp;ldquo;Propriedades&amp;rdquo; e desça a página até &amp;ldquo;Hospedagem de site estático&amp;rdquo; e clique em &amp;ldquo;Editar&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Selecione &amp;ldquo;Ativar&amp;rdquo; e em &amp;ldquo;Documento de índice&amp;rdquo; coloque o arquivo inicial do seu site, geralmente &lt;code&gt;index.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clique em &amp;ldquo;Salvar alterações&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;enviando-os-arquivos-do-site&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#enviando-os-arquivos-do-site&#34;&gt;
        #
    &lt;/a&gt;
    Enviando os arquivos do site
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Agora que tudo está configurado, você pode enviar os arquivos do seu site, para isso, siga os passo abaixo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clique em &amp;ldquo;Objetos&amp;rdquo; e em seguida &amp;ldquo;Carregar&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Arraste os arquivos do seu site ou clique em &amp;ldquo;Adicionar arquivos&amp;rdquo;, em seguida clique em &amp;ldquo;Carregar&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Aguarde o carregamento dos arquivos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;acessando-o-seu-site&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#acessando-o-seu-site&#34;&gt;
        #
    &lt;/a&gt;
    Acessando o seu site
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Com a bucket configurada e com os arquivos do seu site, vamos descobrir a URL gerada e acessar o site.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clique em &amp;ldquo;Propriedades&amp;rdquo; e desça a página até &amp;ldquo;Hospedagem de site estático&amp;rdquo;, a sua url aparecerá logo abaixo.&lt;/li&gt;
&lt;li&gt;Agora, basta acessar e ver o seu site no ar. 🚀&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;é-possível-utilizar-o-meu-domínio-com-esse-tipo-de-hospedagem&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%c3%a9-poss%c3%advel-utilizar-o-meu-dom%c3%adnio-com-esse-tipo-de-hospedagem&#34;&gt;
        #
    &lt;/a&gt;
    É possível utilizar o meu domínio com esse tipo de hospedagem?
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Sim, é possível! Caso você registre o domínio pela própria AWS usando o Route53, fica ainda mais fácil, &lt;a href=&#34;https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;acesse este link para saber mais&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;pt&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>Modelos de Serviços em Computação em Nuvem</title>
      <link>/posts/modelos-de-servicos-cloud-computing/</link>
      <pubDate>Sun, 09 Jun 2024 23:17:30 -0300</pubDate>
      <author>joaosenger.dev@gmail.com (João Senger)</author>
      <guid>/posts/modelos-de-servicos-cloud-computing/</guid>
      <description>&lt;p&gt;Esse artigo visa esclarecer de forma simples os &lt;strong&gt;modelos de serviços em computação em nuvem&lt;/strong&gt; e como eles são implementados em diferentes tipos de negócios.&lt;/p&gt;
&lt;h2 id=&#34;modelos-de-serviços-em-computação-em-nuvem&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#modelos-de-servi%c3%a7os-em-computa%c3%a7%c3%a3o-em-nuvem&#34;&gt;
        #
    &lt;/a&gt;
    Modelos de Serviços em Computação em Nuvem
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Os serviços de computação em nuvem são divididos em três modelos: &lt;strong&gt;Infraestrutura como Serviço (IaaS)&lt;/strong&gt;, &lt;strong&gt;Plataforma como Serviço (PaaS)&lt;/strong&gt; e &lt;strong&gt;Software como Serviço (SaaS)&lt;/strong&gt;, sendo a IaaS o mais &amp;ldquo;baixo nível&amp;rdquo; e o SaaS de mais &amp;ldquo;alto nível&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;infraestrutura-como-serviço-iaas&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#infraestrutura-como-servi%c3%a7o-iaas&#34;&gt;
        #
    &lt;/a&gt;
    Infraestrutura como Serviço (IaaS)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;É o fornecimento de recursos computacionais sob medida para a sua aplicação. Você não precisa comprar um servidor de milhares de reais para rodar a sua aplicação, com um serviço de IaaS você pode comprar um servidor virtual e utilizá-lo sob medida para rodar a sua aplicação.&lt;/p&gt;
&lt;h2 id=&#34;plataforma-como-serviço-paas&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#plataforma-como-servi%c3%a7o-paas&#34;&gt;
        #
    &lt;/a&gt;
    Plataforma como Serviço (PaaS)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Com a Infraestrutura como Serviço já resolvemos a questão de não ter que gastar milhares de reais com um servidor, porém, configurá-lo e gerenciá-lo não é nada simples. A Plataforma como Serviço surge para resolver essa questão, agora toda a parte de gerenciamento da infraestrutura é realizado pela provedora de computação em nuvem. Esse modelo é ideal para quem quer focar no desenvolvimento da aplicação, abstraindo toda a parte de gerenciamento da infraestrutura.&lt;/p&gt;
&lt;h2 id=&#34;software-como-serviço-saas&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#software-como-servi%c3%a7o-saas&#34;&gt;
        #
    &lt;/a&gt;
    Software como Serviço (SaaS)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;É a utilização de um software já pronto, aqui não nos preocupamos com a infraestrutura nem com o desenvolvimento da aplicação, utilizamos o software como um serviço. Um bom exemplo de SaaS é o Gmail, onde não precisamos nos preocupar com a infraestrutura, apenas utilizamos a solução já pronta.&lt;/p&gt;
&lt;h2 id=&#34;analogia-com-um-churrasco&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#analogia-com-um-churrasco&#34;&gt;
        #
    &lt;/a&gt;
    Analogia com um churrasco
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Sim, esta é uma bela forma de entender os modelos de Cloud Computing, se liga:&lt;/p&gt;
&lt;p&gt;No modelo de &lt;strong&gt;IaaS&lt;/strong&gt;, o churrasco seria feito na churrasqueira do condomínio, afinal, você utilizaria a &lt;strong&gt;infraestrutura&lt;/strong&gt; do local como um serviço. Porém, você ainda precisa se preocupar com a carne, o carvão, o tempero, as bebidas e tudo mais!&lt;/p&gt;
&lt;p&gt;Já no modelo de &lt;strong&gt;PaaS&lt;/strong&gt;, pense que você comprou um &lt;strong&gt;kit churrasco&lt;/strong&gt;, agora além de utilizar a Infraestrutura, você não precisa se preocupar com a carne, o carvão, o tempero, as bebidas, tudo veio no kit! Mas&amp;hellip; você ainda tem que assar e servir a carne.&lt;/p&gt;
&lt;p&gt;Por fim, no modelo de &lt;strong&gt;SaaS&lt;/strong&gt;, você não precisa se preocupar com nada. É como ir a uma churrascaria, onde a carne é simplesmente servida.&lt;/p&gt;
&lt;h2 id=&#34;quer-saber-mais-sobre-o-tema&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#quer-saber-mais-sobre-o-tema&#34;&gt;
        #
    &lt;/a&gt;
    Quer saber mais sobre o tema?
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Confira os links abaixo:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://aws.amazon.com/pt/types-of-cloud-computing/&#34; target=&#34;_blank&#34;&gt;AWS: Tipos de computação em nuvem&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://www.redhat.com/pt-br/topics/cloud-computing/iaas-vs-paas-vs-saas&#34; target=&#34;_blank&#34;&gt;Redhat: IaaS x PaaS x SaaS&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;script type=&#39;text/javascript&#39; src=&#39;https://storage.ko-fi.com/cdn/widget/Widget_2.js&#39;&gt;&lt;/script&gt;&lt;script type=&#39;text/javascript&#39;&gt;kofiwidget2.init(&#39;Buy Me a Coffee&#39;, &#39;#29abe0&#39;, &#39;E1E1GK08T&#39;);kofiwidget2.draw();&lt;/script&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34; data-repo=&#34;joaosenger/blogcomments&#34; data-repo-id=&#34;R_kgDOMUgpYw&#34;
    data-category=&#34;General&#34; data-category-id=&#34;DIC_kwDOMUgpY84Cgsfq&#34; data-mapping=&#34;pathname&#34; data-strict=&#34;0&#34;
    data-reactions-enabled=&#34;1&#34; data-emit-metadata=&#34;0&#34; data-input-position=&#34;bottom&#34;
    data-theme=&#34;preferred_color_scheme&#34; data-lang=&#34;pt&#34; crossorigin=&#34;anonymous&#34; async&gt;
&lt;/script&gt;</description>
    </item>
    
  </channel>
</rss>
