{"id":48865,"date":"2025-12-02T14:04:06","date_gmt":"2025-12-02T17:04:06","guid":{"rendered":"\/pt\/tutoriais\/tutorial-django"},"modified":"2026-03-10T12:59:32","modified_gmt":"2026-03-10T15:59:32","slug":"tutorial-django","status":"publish","type":"post","link":"\/pt\/tutoriais\/tutorial-django","title":{"rendered":"Tutorial Django: entendendo os fundamentos do framework Django"},"content":{"rendered":"<?xml encoding=\"utf-8\" ?><p>O Django &eacute; um framework Python de alto n&iacute;vel usado para atividades de desenvolvimento r&aacute;pido e de design simples e pragm&aacute;tico. Ele simplifica muitas tarefas de desenvolvimento web, permitindo que voc&ecirc; se concentre em desenvolver sua aplica&ccedil;&atilde;o sem precisar reinventar a roda.<\/p><p>Isso faz do Django um dos frameworks mais populares e amplamente utilizados para criar sites e aplicativos din&acirc;micos e orientados por dados.<\/p><p>Neste tutorial, vamos apresentar os fundamentos b&aacute;sicos do Django e fornecer uma base s&oacute;lida para que voc&ecirc; possa criar sua primeira aplica&ccedil;&atilde;o web com esse framework. Voc&ecirc; vai conhecer todos os processos b&aacute;sicos, desde a configura&ccedil;&atilde;o de uma VPS e a instala&ccedil;&atilde;o do Python at&eacute; o deployment, ou lan&ccedil;amento, do seu projeto Django.<\/p><p>Ao final deste tutorial, voc&ecirc; ser&aacute; capaz de desenvolver uma aplica&ccedil;&atilde;o web totalmente funcional e entender como continuar a desenvolver seus pr&oacute;prios projetos usando o Django. Se voc&ecirc; &eacute; novo no mundo do desenvolvimento web ou est&aacute; procurando expandir suas habilidades, este tutorial Django vai te ajudar a dominar o essencial.<\/p><p>\n\n\n\n<\/p><h2 class=\"wp-block-heading\" id=\"h-instalando-o-framework-django\"><strong>Instalando o framework Django&nbsp;<\/strong><\/h2><p>Antes de come&ccedil;ar a criar uma aplica&ccedil;&atilde;o Django, &eacute; necess&aacute;rio configurar um ambiente de desenvolvimento. Esse processo inclui a configura&ccedil;&atilde;o de uma VPS, a instala&ccedil;&atilde;o do Python, a cria&ccedil;&atilde;o de um ambiente virtual e a instala&ccedil;&atilde;o do Django.<\/p><h3 class=\"wp-block-heading\" id=\"h-pre-requisitos\"><strong>Pr&eacute;-requisitos<\/strong><\/h3><p>Antes de come&ccedil;ar a trabalhar com o Django, &eacute; importante ter um entendimento b&aacute;sico de determinados conceitos de programa&ccedil;&atilde;o. Listamos algumas no&ccedil;&otilde;es que voc&ecirc; deve dominar:<\/p><ul class=\"wp-block-list\">\n<li><strong>Conhecimento b&aacute;sico de Python<\/strong>: Compreens&atilde;o s&oacute;lida dos fundamentos do Python &ndash;&nbsp; tipos de dados, fluxo de controle, fun&ccedil;&otilde;es, classes, m&oacute;dulos.&nbsp;<\/li>\n\n\n\n<li><strong>No&ccedil;&otilde;es iniciais de HTML, CSS e JavaScript:&nbsp;<\/strong>Conhecimento b&aacute;sico de HTML, CSS e JavaScript.<strong>&nbsp;<\/strong><\/li>\n\n\n\n<li><strong>Compreens&atilde;o de bancos de dados:&nbsp;<\/strong>Conceitos relativos a banco de dados&nbsp; &ndash; tabelas, relat&oacute;rios, chave prim&aacute;ria, chave estrangeira. Ter conhecimento em SQL &eacute; uma vantagem.<\/li>\n\n\n\n<li><strong>Familiaridade com a interface de linha de comando (CLI):&nbsp;<\/strong>Conhecimento b&aacute;sico dos<strong>&nbsp;<\/strong><a href=\"\/pt\/tutoriais\/comandos-linux\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>comandos essenciais do Linux<\/strong><\/a><strong>.<\/strong><\/li>\n<\/ul><p>Atendendo a estas condi&ccedil;&otilde;es, voc&ecirc; estar&aacute; bem preparado para entender e executar as etapas necess&aacute;rias para instalar o Django e come&ccedil;ar a criar seus projetos online.<\/p><h3 class=\"wp-block-heading\" id=\"h-adquira-um-vps-django\"><strong>Adquira um VPS django<\/strong><\/h3><p>Escolher o ambiente de hospedagem correto &eacute; crucial para desenvolver e executar sua aplica&ccedil;&atilde;o Django. Um Servidor Virtual Privado (VPS) oferece mais controle, recursos e capacidade de expans&atilde;o do que uma hospedagem compartilhada, por isso, &eacute; ideal para projetos Django. A&nbsp;<a href=\"\/pt\/vps\/hospedagem-django\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>hospedagem VPS Django da Hostinger<\/strong><\/a>&nbsp;&eacute; uma excelente op&ccedil;&atilde;o, com planos acess&iacute;veis, os servidores s&atilde;o f&aacute;ceis de configurar e gerenciar.<\/p><p>Ao selecionar um plano VPS da Hostinger, considere as necessidades de seu projeto:<\/p><ul class=\"wp-block-list\">\n<li><strong>CPU e RAM:&nbsp;<\/strong>CPU mais r&aacute;pida e mais capacidade de RAM proporcionam melhor desempenho, especialmente para aplicativos mais complexos ou volumes de tr&aacute;fego mais altos.<\/li>\n\n\n\n<li><strong>Armazenamento:&nbsp;<\/strong>Os aplicativos Django geralmente trabalham com bancos de dados e arquivos est&aacute;ticos. Sua VPS deve ter armazenamento SSD suficiente para as exig&ecirc;ncias do seu projeto.<\/li>\n\n\n\n<li><strong>Banda larga:&nbsp;<\/strong>esse recurso depende do tr&aacute;fego esperado, assim, escolha um plano com largura de banda suficiente para suportar seus visitantes sem causar lentid&atilde;o.<\/li>\n<\/ul><p>Para um projeto Django b&aacute;sico, um plano VPS b&aacute;sico, como<strong>&nbsp;KVM 1<\/strong>&nbsp;ou&nbsp;<strong>KVM 2<\/strong>, costuma ser suficiente. Por&eacute;m, &agrave; medida que seu projeto crescer, voc&ecirc; poder&aacute; facilmente fazer um upgrade para op&ccedil;&otilde;es de planos com mais recursos.<\/p><figure class=\"wp-block-image size-large\"><a href=\"\/pt\/alojamento-vps\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/blog.hostinger.io\/pt-tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-1024x300.png\" alt=\"\" class=\"wp-image-32923\" srcset=\"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1.png 1024w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-300x88.png 300w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-150x44.png 150w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-768x225.png 768w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-1536x450.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><p>Depois de escolher uma hospedagem VPS e concluir a compra, siga as etapas a seguir para configurar seu servidor:<\/p><ol class=\"wp-block-list\">\n<li><strong>Iniciar a configura&ccedil;&atilde;o:<\/strong>&nbsp;Fa&ccedil;a login na sua conta e acesse o&nbsp;<a href=\"https:\/\/auth.hostinger.com\/br\/login\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>hPanel<\/strong><\/a>. Na p&aacute;gina inicial, voc&ecirc; ver&aacute; uma configura&ccedil;&atilde;o de VPS pendente, semelhante a esta:<\/li>\n<\/ol><div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/get_a_django_vps_2-1024x126.png\" alt=\"vps com configura&ccedil;&atilde;o pendente no hpanel\" class=\"wp-image-49251\"><\/figure><\/div><ol start=\"2\" class=\"wp-block-list\">\n<li>Pressione&nbsp;<strong>Setup&nbsp;<\/strong>e&nbsp;<strong>Start Now<\/strong>&nbsp;para&nbsp;<strong>come&ccedil;ar&nbsp;<\/strong>a&nbsp;<strong>configurar&nbsp;<\/strong>seu servidor.<\/li>\n\n\n\n<li><strong>Selecione um local de hospedagem:&nbsp;<\/strong>considere a regi&atilde;o de onde est&aacute; esperando receber tr&aacute;fego. A regi&atilde;o de menor lat&ecirc;ncia n&atilde;o &eacute; necessariamente a melhor para o seu aplicativo, por exemplo, se o tr&aacute;fego esperado vier da Austr&aacute;lia enquanto voc&ecirc; estiver na Europa.<\/li>\n<\/ol><div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"804\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2024\/06\/alterar-localizacao-servidor-vps-hpanel-1024x804.png\" alt=\"alterar a localiza&ccedil;&atilde;o do servidor vps no hpanel\" class=\"wp-image-44625\" srcset=\"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2024\/06\/alterar-localizacao-servidor-vps-hpanel.png 1024w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2024\/06\/alterar-localizacao-servidor-vps-hpanel-300x236.png 300w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2024\/06\/alterar-localizacao-servidor-vps-hpanel-150x118.png 150w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2024\/06\/alterar-localizacao-servidor-vps-hpanel-768x603.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div><ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Selecione o sistema operacional:&nbsp;<\/strong>Para seguir o passo-a-passo deste tutorial, voc&ecirc; deve selecionar o sistema operacional Ubuntu simples. No entanto, vale lembrar que a Hostinger tamb&eacute;m oferece op&ccedil;&otilde;es de sistema operacional com painel e um sistema operacional com&nbsp;application stack&nbsp;(depend&ecirc;ncias de software pr&eacute;-instaladas).<\/li>\n\n\n\n<li><strong>Configure suas credenciais:&nbsp;<\/strong>Digite a senha&nbsp;<strong>root&nbsp;<\/strong>e adicione uma chave SSH, se desejar. Conclua a configura&ccedil;&atilde;o.<\/li>\n\n\n\n<li><strong>Conecte-se via SSH:<\/strong>&nbsp;use um cliente SSH (por exemplo, PuTTY para Windows ou o terminal para macOS\/Linux) para se conectar ao servidor. No terminal, digite:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh root@ip_do_seu_vps<\/pre><ol start=\"7\" class=\"wp-block-list\">\n<li>Substitua<strong>&nbsp;your_vps_ip&nbsp;<\/strong>pelo endere&ccedil;o IP da VPS da Hostinger. Em seguida, voc&ecirc; dever&aacute; digitar sua senha.<\/li>\n\n\n\n<li><strong>Atualize o servidor:&nbsp;<\/strong>&Eacute; importante atualizar seu servidor. Execute o seguinte comando para atualizar os pacotes do sistema:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt update &amp;amp;&amp;amp; apt upgrade -y<\/pre><p>Com a hospedagem VPS pronta, voc&ecirc; j&aacute; pode instalar o Python e outras depend&ecirc;ncias necess&aacute;rias para o desenvolvimento Django.<\/p><h3 class=\"wp-block-heading\" id=\"h-instale-o-python\"><strong>Instale o Python<\/strong><\/h3><p>Para executar o Django, voc&ecirc; precisar&aacute;&nbsp;<a href=\"\/pt\/tutoriais\/como-instalar-python-ubuntu\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>instalar o Python e o sistema de pacotes pip<\/strong><\/a>&nbsp;na VPS. A maioria dos sistemas operacionais modernos do Linux, como o Ubuntu, j&aacute; vem com o Python pr&eacute;-instalado.<\/p><p>Se voc&ecirc; n&atilde;o tiver instalado ou precisar atualizar o Python, o processo &eacute; bem simples. Use os comandos abaixo para verificar a vers&atilde;o atual e instalar a vers&atilde;o mais recente do Python3:<\/p><ol class=\"wp-block-list\">\n<li>Verifique se o Python est&aacute; instalado:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 --version<\/pre><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/install_python.png\" alt=\"verificando vers&atilde;o do python\" class=\"wp-image-49252\"><\/figure><\/div><ol start=\"2\" class=\"wp-block-list\">\n<li>Se sua interface de linha de comando retornar o n&uacute;mero da vers&atilde;o do Python, a linguagem de programa&ccedil;&atilde;o j&aacute; est&aacute; instalada. Nesse caso, voc&ecirc; s&oacute; precisa instalar o pip:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt install python3-pip<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Instale o Python e o pip (se necess&aacute;rio):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt install python3 python3-pip -y<\/pre><p>Depois que o Python estiver instalado, voc&ecirc; estar&aacute; pronto para configurar um ambiente virtual.<\/p><h3 class=\"wp-block-heading\" id=\"h-configure-um-ambiente-virtual\"><strong>Configure um ambiente virtual<\/strong><\/h3><p>Um ambiente virtual &eacute; um espa&ccedil;o isolado no qual voc&ecirc; pode instalar pacotes e depend&ecirc;ncias Python para desenvolver um projeto espec&iacute;fico. Esse m&eacute;todo n&atilde;o afeta o ambiente Python de todo o sistema ou outros projetos.<\/p><p>Essa etapa &eacute; crucial para trabalhar com o Django, j&aacute; que projetos diferentes podem exigir vers&otilde;es diferentes de certos pacotes. Um ambiente virtual garante que as depend&ecirc;ncias de cada projeto estejam contidas de forma organizada e n&atilde;o entrem em conflito umas com as outras.<\/p><p>Por que usar um ambiente virtual?<\/p><ul class=\"wp-block-list\">\n<li><strong>Isolamento:&nbsp;<\/strong>Mant&eacute;m as depend&ecirc;ncias de seu projeto separadas de outros projetos Python.<\/li>\n\n\n\n<li><strong>Controle de vers&otilde;es:&nbsp;<\/strong>Voc&ecirc; pode instalar diferentes vers&otilde;es de pacotes em cada espa&ccedil;o de trabalho virtual, evitando conflitos entre projetos.<\/li>\n\n\n\n<li><strong>Ambiente mais limpo:&nbsp;<\/strong>Permite que voc&ecirc; fa&ccedil;a experi&ecirc;ncias com pacotes sem afetar todo o ambiente Python do seu servidor.<\/li>\n<\/ul><p>Siga as etapas abaixo para configurar um ambiente virtual Python em sua VPS:<\/p><ol class=\"wp-block-list\">\n<li>Instale o pacote&nbsp;<strong>venv&nbsp;<\/strong>(se ele ainda n&atilde;o estiver instalado):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt install python3-venv -y<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Crie o diret&oacute;rio onde voc&ecirc; deseja armazenar seu projeto Django e crie um ambiente virtual:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mkdir myprojectcd myproject<\/pre><p>Substitua&nbsp;<strong>myproject&nbsp;<\/strong>pelo nome que voc&ecirc; quiser dar &agrave; pasta do projeto.<\/p><ol start=\"3\" class=\"wp-block-list\">\n<li>Crie um ambiente virtual usando o&nbsp;<strong>venv<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 -m venv env_name<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Ative o ambiente Phyton:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">source env_name\/bin\/activate<\/pre><p>Uma vez ativado, o shell prompt ser&aacute; alterado, passando a refletir o ambiente criado&nbsp;<strong>(por exemplo, (env_name))<\/strong>, indicando que voc&ecirc; est&aacute; trabalhando neste ambiente virtual.<\/p><p>Essa configura&ccedil;&atilde;o garante que todas as depend&ecirc;ncias relacionadas ao Django sejam isoladas dentro do ambiente virtual criado, mantendo seu servidor limpo e organizado.<\/p><h3 class=\"wp-block-heading\" id=\"h-instale-o-django\"><strong>Instale o Django<\/strong><\/h3><p>Com o ambiente virtual Python configurado, a pr&oacute;xima etapa &eacute; instalar o framework em si, etapa que pode ser feita atrav&eacute;s do gerenciador de pacotes do Python, o&nbsp;<strong>pip<\/strong>. A instala&ccedil;&atilde;o do Django em seu ambiente virtual garante que ele possa ser gerenciado de forma independente.<\/p><p>Para instalar o Django, siga estes passos:<\/p><ol class=\"wp-block-list\">\n<li>Com o ambiente virtual ativado, use o pip para instalar a vers&atilde;o mais recente do Django:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install django<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Esse comando far&aacute; o download e a instala&ccedil;&atilde;o da estrutura e de todas as depend&ecirc;ncias do Django no ambiente virtual.<\/li>\n\n\n\n<li>Depois disso, use o seguinte comando para confirmar que o Django est&aacute; instalado e para verificar a atual vers&atilde;o:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">django-admin --version<\/pre><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/install_django_1.png\" alt=\"verificando vers&atilde;o do Django\" class=\"wp-image-49253\"><\/figure><\/div><p>Ao verificar a vers&atilde;o atual do Django instalada em seu ambiente virtual, voc&ecirc; confirma que a instala&ccedil;&atilde;o foi bem-sucedida.<\/p><p>Com sua VPS preparada para hospedar um projeto Django, voc&ecirc; pode come&ccedil;ar a criar sua aplica&ccedil;&atilde;o web.<\/p><h2 class=\"wp-block-heading\" id=\"h-criando-um-novo-projeto-django\"><strong>Criando um novo projeto Django<\/strong><\/h2><p>Chegou a hora de criar seu primeiro projeto usando Django. Nesta se&ccedil;&atilde;o, vamos apresentar a base de c&oacute;digos necess&aacute;ria para come&ccedil;ar a desenvolver o seu site ou aplicativo.<\/p><p>Para criar um novo projeto Django:<\/p><ol class=\"wp-block-list\">\n<li><strong>Acesse o diret&oacute;rio do seu projeto:&nbsp;<\/strong>Se voc&ecirc; ainda n&atilde;o estiver na pasta em que deseja criar o projeto, use o comando&nbsp;<strong>cd&nbsp;<\/strong>para navegar at&eacute; l&aacute;.<\/li>\n\n\n\n<li><strong>Execute o comando startproject:&nbsp;<\/strong>Use o comando&nbsp;<strong>startproject&nbsp;<\/strong>para criar um novo projeto. Substitua&nbsp;<strong>myproject&nbsp;<\/strong>pelo nome que deseja dar ao seu projeto:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">django-admin startproject myproject<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Isso criar&aacute; um novo diret&oacute;rio chamado&nbsp;<strong>myproject&nbsp;<\/strong>que cont&eacute;m a estrutura padr&atilde;o do framework.<\/li>\n\n\n\n<li>Em seguida, navegue at&eacute; a pasta interna com o nome do seu projeto:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd myproject\/myproject<\/pre><ol start=\"5\" class=\"wp-block-list\">\n<li><strong>Adicione o IP do seu servidor &agrave; lista de hosts permitidos &ndash; ALLOWED_HOSTS:<\/strong>&nbsp;Use um dos editores de texto padr&atilde;o do Ubuntu (<strong>nano<\/strong>&nbsp;ou&nbsp;<strong>vim<\/strong>) e abra o arquivo&nbsp;<strong>settings.py:<\/strong><\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">vim settings.py<\/pre><ol start=\"6\" class=\"wp-block-list\">\n<li>Localize a configura&ccedil;&atilde;o&nbsp;<strong>ALLOWED_HOSTS<\/strong>&nbsp;e edite a lista para adicionar o IP do seu VPS:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ALLOWED_HOSTS = ['ip_do_seu_vps']<\/pre><ol start=\"7\" class=\"wp-block-list\">\n<li>Substitua&nbsp;<strong>ip_do_seu_vps<\/strong>&nbsp;pelo IP real do seu servidor VPS da Hostinger.<\/li>\n\n\n\n<li><strong>Inicie o servidor de desenvolvimento:<\/strong>&nbsp;Para verificar se tudo est&aacute; configurado corretamente, voc&ecirc; pode iniciar o servidor de desenvolvimento Django. Retorne &agrave; categoria do parent project e execute o comando&nbsp;<strong>runserver<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;runserver 0.0.0.0:8000<\/pre><p>Agora, abra seu navegador e acesse&nbsp;<strong>http:\/\/ip_do_seu_vps:8000\/&nbsp;<\/strong>&ndash; lembrando de substituir<strong>&nbsp;ip_do_seu_vps&nbsp;<\/strong>pelo IP da sua VPS. Se os passos anteriores foram feitos corretamente, voc&ecirc; dever&aacute; ver a p&aacute;gina de boas-vindas do Django:<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/install_django_2.png\" alt=\"p&aacute;gina de boas vindas do django\" class=\"wp-image-49254\"><\/figure><\/div><p>Se voc&ecirc; seguiu as etapas indicadas, voc&ecirc; acabou de construir e executar um projeto padr&atilde;o do Django em sua VPS. O restante deste tutorial Django se aprofunda no desenvolvimento de aplica&ccedil;&otilde;es e na compreens&atilde;o do Django em geral.<\/p><h3 class=\"wp-block-heading\" id=\"h-entendendo-a-estrutura-de-um-projeto-django\"><strong>Entendendo a estrutura de um projeto Django<\/strong><\/h3><p>A execu&ccedil;&atilde;o do comando&nbsp;<strong>startproject&nbsp;<\/strong>cria a estrutura b&aacute;sica para um projeto Django e inclui v&aacute;rios arquivos e diret&oacute;rios importantes. Abaixo indicamos detalhadamente a estrutura e a finalidade de cada componente do framework:<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_1.png\" alt=\"estrutura de um projeto django\" class=\"wp-image-49255\"><\/figure><\/div><p>Cada um desses arquivos e diret&oacute;rios desempenha uma fun&ccedil;&atilde;o espec&iacute;fica em seu projeto Django:<\/p><ul class=\"wp-block-list\">\n<li><strong>manage.py<\/strong>:<\/li>\n<\/ul><p>Esse &eacute; um utilit&aacute;rio de linha de comando que te ajuda a interagir com projetos Django. Ele &eacute; utilizado para tarefas como a execu&ccedil;&atilde;o do servidor dev, a migra&ccedil;&atilde;o de bancos de dados e o gerenciamento do aplicativo:<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_2.png\" alt=\"arquivo manage.py do django\" class=\"wp-image-49256\"><\/figure><\/div><p>Suas principais fun&ccedil;&otilde;es s&atilde;o:<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_3.png\" alt=\"estrutura do projeto manage.py do django\" class=\"wp-image-49257\"><\/figure><\/div><p>Determina a vari&aacute;vel do ambiente para indicar ao framework Django quais arquivos de configura&ccedil;&atilde;o devem ser utilizados.<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_4.png\" alt=\"estrutura do projeto manage.py do django\" class=\"wp-image-49258\"><\/figure><\/div><p>Executa v&aacute;rios comandos do Django, como runserver, migrate e outros.<\/p><ul class=\"wp-block-list\">\n<li><strong>myproject\/:<\/strong><\/li>\n<\/ul><p>&Eacute; o diret&oacute;rio interno do projeto que cont&eacute;m as principais defini&ccedil;&otilde;es, configura&ccedil;&otilde;es e outros arquivos padr&atilde;o do seu projeto Django.<\/p><ul class=\"wp-block-list\">\n<li><strong>init.py:<\/strong><\/li>\n<\/ul><p>Esse arquivo marca o diret&oacute;rio como um pacote Python, permitindo que o c&oacute;digo seja importado como um m&oacute;dulo em Python. Por padr&atilde;o, esse elemento &eacute; instalado vazio.<\/p><ul class=\"wp-block-list\">\n<li><strong>settings.py:<\/strong><\/li>\n<\/ul><p>Esse &eacute; um dos arquivos mais importantes do Django. Ele cont&eacute;m todas as defini&ccedil;&otilde;es de configura&ccedil;&atilde;o para o seu projeto, incluindo configura&ccedil;&otilde;es de banco de dados, aplicativos instalados, middleware e configura&ccedil;&otilde;es de arquivos est&aacute;ticos.<\/p><ul class=\"wp-block-list\">\n<li><strong>urls.py:<\/strong><\/li>\n<\/ul><p>Esse diret&oacute;rio define os caminhos de URL para acessar sua aplica&ccedil;&atilde;o. Ele mapeia URLs para views que fazem solicita&ccedil;&otilde;es e retornam respostas.<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_5.png\" alt=\"estrutura do projeto manage.py do django\" class=\"wp-image-49259\"><\/figure><\/div><p>Conforme adicionar mais funcionalidades ao seu projeto, voc&ecirc; estender&aacute; os padr&otilde;es de url (<strong>urlpatterns<\/strong>) para incluir os caminhos de suas pr&oacute;prias views.&nbsp;<\/p><ul class=\"wp-block-list\">\n<li><strong>asgi.py:<\/strong><\/li>\n<\/ul><p>Esse arquivo fornece um ponto de entrada para servidores web compat&iacute;veis com ASGI (Asynchronous Server Gateway Interface). Esse protocolo de comunica&ccedil;&atilde;o entre servidores e aplica&ccedil;&otilde;es Python &eacute; o padr&atilde;o para aplicativos Django ass&iacute;ncronos.<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_6.png\" alt=\"estrutura do projeto manage.py do django\" class=\"wp-image-49260\"><\/figure><\/div><ul class=\"wp-block-list\">\n<li><strong>wsgi.py:<\/strong><\/li>\n<\/ul><p>Esse arquivo &eacute; o ponto de entrada de servidores da Web compat&iacute;veis com WSGI (Web Server Gateway Interface), como o Gunicorn ou o uWSGI, para atender ao seu projeto em um ambiente de produ&ccedil;&atilde;o.<\/p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/blog.hostinger.io\/br-tutoriais\/wp-content\/uploads\/sites\/53\/2025\/03\/understanding_the_project_structure_7.png\" alt=\"estrutura do projeto manage.py do django\" class=\"wp-image-49261\"><\/figure><\/div><p>Compreender a fun&ccedil;&atilde;o de cada arquivo e diret&oacute;rio te ajuda a modificar configura&ccedil;&otilde;es, adicionar URLs e gerenciar a estrutura do seu projeto como um todo.<\/p><h2 class=\"wp-block-heading\" id=\"h-entendendo-os-modelos-e-bancos-de-dados-do-django\"><strong>Entendendo os modelos e bancos de dados do Django<\/strong><\/h2><p>Com seu projeto Django configurado e em execu&ccedil;&atilde;o, o pr&oacute;ximo passo &eacute; mergulhar em um dos principais componentes de qualquer programa da web: o gerenciamento de dados. Nesta se&ccedil;&atilde;o, vamos entender como o Django lida com modelos e bancos de dados para alimentar aplica&ccedil;&otilde;es din&acirc;micas e orientadas por dados.<\/p><h3 class=\"wp-block-heading\" id=\"h-criando-e-migrando-modelos\"><strong>Criando e migrando modelos<\/strong><\/h3><p>No Django, os&nbsp;<strong>modelos&nbsp;<\/strong>(<strong>models<\/strong>)<strong>&nbsp;<\/strong>definem a estrutura das tabelas do seu banco de dados. Eles representam classes Python que mapeiam diretamente as tabelas do banco de dados, permitindo que voc&ecirc; interaja com seus dados de uma forma mais conveniente. Cada classe de cada modelo representa uma tabela, e cada atributo do modelo representa um campo da tabela.<\/p><p>O Django abstrai o c&oacute;digo SQL, facilitando a cria&ccedil;&atilde;o, a atualiza&ccedil;&atilde;o e o gerenciamento de bancos de dados sem que voc&ecirc; precise escrever consultas SQL brutas.<\/p><p><strong>Criando um modelo<\/strong><\/p><p>Para criar um modelo, voc&ecirc; definir&aacute; uma classe Python dentro do arquivo&nbsp;<strong>models.py&nbsp;<\/strong>de uma de suas aplica&ccedil;&otilde;es. Cada atributo (attribute) na classe (class) corresponde a um campo do banco de dados, e o Django trabalha automaticamente com a estrutura subjacente do banco de dados.<\/p><p>Abaixo indicamos um exemplo de um modelo simples criado para um projeto Django:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># In your app's models.py file\nfrom django.db import models\nclass Book(models.Model):\n    title = models.CharField(max_length=200)\n    author = models.CharField(max_length=100)\n    published_date = models.DateField()\n    isbn = models.CharField(max_length=13, unique=True)\n    def __str__(self):\n        return self.title<\/pre><ul class=\"wp-block-list\">\n<li><strong>title&nbsp;<\/strong>e&nbsp;<strong>author<\/strong>: s&atilde;o os campos de caracteres (<strong>CharField<\/strong>) de&nbsp;<strong>t&iacute;tulo<\/strong>&nbsp;e&nbsp;<strong>autor<\/strong>, e possuem limite de comprimento.<\/li>\n\n\n\n<li><strong>published_date<\/strong>: esse &eacute; o campo de data (<strong>DateField<\/strong>).<\/li>\n\n\n\n<li><strong>isbn<\/strong>: um campo de caractere com uma restri&ccedil;&atilde;o &uacute;nica (<strong>unique constraint<\/strong>).<\/li>\n<\/ul><p>O m&eacute;todo<strong>&nbsp;str()<\/strong>&nbsp;garante que, quando voc&ecirc; consulta (<strong>query<\/strong>) um elemento,&nbsp;<strong>book&nbsp;<\/strong>no nosso exemplo,&nbsp;ele retorna o t&iacute;tulo do&nbsp;<strong>livro&nbsp;<\/strong>como uma representa&ccedil;&atilde;o de string.<\/p><p><strong>Adicionando o modelo ao banco de dados<\/strong><\/p><p>Depois de criar um modelo, o Django precisa traduzir esse elemento para uma tabela de banco de dados. Esse processo &eacute; feito atrav&eacute;s de&nbsp;<strong>migra&ccedil;&otilde;es&nbsp;<\/strong>(<strong>migrations<\/strong>), que s&atilde;o arquivos que o Django usa para monitorar as altera&ccedil;&otilde;es em seus modelos.<\/p><ol class=\"wp-block-list\">\n<li><strong>Crie uma migra&ccedil;&atilde;o:&nbsp;<\/strong>Para criar o arquivo migration do seu novo modelo, execute o seguinte comando:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;makemigrations<\/pre><p>O Django vai analisar as altera&ccedil;&otilde;es em seu arquivo&nbsp;<strong>models.py<\/strong>&nbsp;e gerar um arquivo de migra&ccedil;&atilde;o que descreve essas altera&ccedil;&otilde;es em instru&ccedil;&otilde;es estilo SQL.<\/p><p>Voc&ecirc; ver&aacute; outputs semelhantes a este:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Migrations for 'myapp':\n  myapp\/migrations\/0001_initial.py\n    - Create model Book<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Efetive a migra&ccedil;&atilde;o:&nbsp;<\/strong>Depois de criar o arquivo de migration, aplique ao banco de dados com o comando&nbsp;<strong>migrate<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;migrate<\/pre><p>Com isso, as tabelas necess&aacute;rias estar&atilde;o criadas em seu banco de dados. Agora, o modelo&nbsp;<strong>Book&nbsp;<\/strong>ser&aacute; representado por uma tabela&nbsp;<strong>Book&nbsp;<\/strong>correspondente em seu banco de dados, e voc&ecirc; pode come&ccedil;ar a adicionar, consultar e gerenciar os dados.<\/p><h3 class=\"wp-block-heading\" id=\"h-configure-o-banco-de-dados\"><strong>Configure o banco de dados<\/strong><\/h3><p>O Django suporta v&aacute;rios bancos de dados, permitindo que voc&ecirc; escolha o melhor para o seu projeto. O banco de dados padr&atilde;o no Django &eacute; o&nbsp;<strong>SQLite<\/strong>, que &eacute; leve e f&aacute;cil de configurar, ou seja, ideal para o desenvolvimento de pequenos projetos.<\/p><p>No entanto, para ambientes de produ&ccedil;&atilde;o, bancos de dados mais robustos, como&nbsp;<strong>PostgreSQL<\/strong>,&nbsp;<strong>MySQL<\/strong>&nbsp;ou&nbsp;<strong>MariaDB<\/strong>, s&atilde;o as op&ccedil;&otilde;es recomendadas, devido &agrave; sua escalabilidade e desempenho.<\/p><p>O Django oferece suporte integrado para todos esses bancos de dados. Vamos come&ccedil;ar com a configura&ccedil;&atilde;o do banco de dados padr&atilde;o (SQLite).<\/p><p><strong>Configurando o banco de dados padr&atilde;o SQLite&nbsp;<\/strong><\/p><p>Por padr&atilde;o, o Django &eacute; configurado para usar o SQLite, que vem pr&eacute;-instalado com o Python. Portanto, nenhuma configura&ccedil;&atilde;o adicional &eacute; necess&aacute;ria. O pr&oacute;ximo passo &eacute; conferir se seu projeto est&aacute; pronto para usar o SQLite:<\/p><ol class=\"wp-block-list\">\n<li>Navegue at&eacute; o arquivo&nbsp;<strong>settings.py<\/strong>&nbsp;do seu projeto, que dever&aacute; estar localizado na pasta do projeto (<strong>myproject&rarr;myproject&rarr;settings.py<\/strong>).<\/li>\n\n\n\n<li>V&aacute; para a se&ccedil;&atilde;o&nbsp;<strong>DATABASES&nbsp;<\/strong>do&nbsp;<strong>settings.py<\/strong>, onde o Django j&aacute; ter&aacute; configurado o SQLite como o banco de dados padr&atilde;o. O arquivo deve se parecer com o seguinte:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': BASE_DIR \/ 'db.sqlite3',\n    }\n}<\/pre><ul class=\"wp-block-list\">\n<li><strong>ENGINE<\/strong>: Significa &ldquo;motor&rdquo;, e indica o back-end do banco de dados (nesse caso, SQLite).<\/li>\n\n\n\n<li><strong>NAME<\/strong>: se refere ao &ldquo;nome&rdquo; e indica o caminho para o arquivo de banco de dados SQLite (<strong>db.sqlite3<\/strong>). O Django cria esse arquivo automaticamente quando voc&ecirc; executa o migrate inicial.<\/li>\n<\/ul><ol start=\"3\" class=\"wp-block-list\">\n<li>Depois de confirmar as configura&ccedil;&otilde;es do banco de dados, &eacute; necess&aacute;rio aplicar as migra&ccedil;&otilde;es iniciais para configurar as tabelas b&aacute;sicas (como usu&aacute;rios e sess&otilde;es). Para isso, execute o seguinte comando:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;migrate<\/pre><p>Esse comando cria o arquivo<strong>&nbsp;db.sqlite3&nbsp;<\/strong>no diret&oacute;rio raiz do seu projeto e configura todas as tabelas necess&aacute;rias para a execu&ccedil;&atilde;o do aplicativo.<\/p><ol start=\"4\" class=\"wp-block-list\">\n<li>Quando as migrations forem conclu&iacute;das, verifique se o arquivo&nbsp;<strong>db.sqlite3<\/strong>&nbsp;foi criado na pasta do projeto. Esse arquivo armazena seu banco de dados localmente e cresce &agrave; medida que voc&ecirc; adicionar mais dados ao projeto.<\/li>\n<\/ol><h3 class=\"wp-block-heading\" id=\"h-integracao-do-banco-de-dados\"><strong>Integra&ccedil;&atilde;o do banco de dados&nbsp;<\/strong><\/h3><p>Depois de configurar o banco de dados SQLite para o desenvolvimento do projeto, e conforme a quantidade de dados crescer, pode ser necess&aacute;rio integrar um sistema de gerenciamento de banco de dados (DBMS) mais robusto. O Django suporta v&aacute;rios DBMSs, incluindo&nbsp;<strong>PostgreSQL, MySQL, MariaDB&nbsp;<\/strong>e&nbsp;<strong>Oracle<\/strong>, cada um com suas pr&oacute;prias vantagens e processos de configura&ccedil;&atilde;o e integra&ccedil;&atilde;o.<\/p><p>Nesta se&ccedil;&atilde;o, vamos apresentar uma vis&atilde;o geral de cada uma das op&ccedil;&otilde;es:<\/p><ul class=\"wp-block-list\">\n<li><strong>SQLite:&nbsp;<\/strong>Esse &eacute; o banco de dados padr&atilde;o no Django e &eacute; ideal para&nbsp;<strong>desenvolvimento&nbsp;<\/strong>e pequenos projetos. Ele &eacute; leve, baseado em arquivos e n&atilde;o requer nenhuma configura&ccedil;&atilde;o al&eacute;m do que o Django fornece automaticamente. No entanto, n&atilde;o &eacute; adequado para ambientes de produ&ccedil;&atilde;o porque n&atilde;o possui recursos avan&ccedil;ados &ndash; como grava&ccedil;&otilde;es simult&acirc;neas, escalabilidade e suporte a tr&aacute;fego intenso.<br><br><strong>Instala&ccedil;&atilde;o:&nbsp;<\/strong>O SQLite n&atilde;o requer nenhuma a&ccedil;&atilde;o adicional no Django; ele vem pronto para ser usado.<br><br><strong>Configura&ccedil;&atilde;o:&nbsp;<\/strong>O Django &eacute; pr&eacute;-configurado para usar o SQLite com as seguintes configura&ccedil;&otilde;es no arquivo&nbsp;<strong>settings.py<\/strong>:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': BASE_DIR \/ 'db.sqlite3',\n    }\n}<\/pre><p>Note que o SQlite trabalha com apenas dois par&acirc;metros:&nbsp;<strong>ENGINE&nbsp;<\/strong>e&nbsp;<strong>NAME<\/strong>.<\/p><ul class=\"wp-block-list\">\n<li><strong>PostgreSQL:<\/strong>&nbsp;Um banco de dados potente e de c&oacute;digo aberto que possui recursos avan&ccedil;ados &ndash; como suporte a consultas complexas (complex queries), tipos de dados como JSON e pesquisa de texto completo. &Eacute; altamente recomendado para aplicativos Django de&nbsp;<strong>produ&ccedil;&atilde;o&nbsp;<\/strong>devido &agrave; sua escalabilidade e ampla cole&ccedil;&atilde;o de recursos. O PostgreSQL &eacute; conhecido por aderir estritamente aos padr&otilde;es SQL e ser ideal para aplicativos complexos e de grande escala.<br><br><strong>Configura&ccedil;&atilde;o:&nbsp;<\/strong>Para rodar o PostgreSQL &eacute; preciso instalar o pacote&nbsp;<strong>psycopg2<\/strong>, que atua como adaptador entre o Django e o banco de dados PostgreSQL.<br><br><strong>Configura&ccedil;&atilde;o:&nbsp;<\/strong>Al&eacute;m dos par&acirc;metros que s&atilde;o padr&atilde;o para o SQLite,&nbsp;<strong>ENGINE&nbsp;<\/strong>e&nbsp;<strong>NAME<\/strong>, o PostgreSQL tamb&eacute;m requer par&acirc;metros de usu&aacute;rio, senha, host e porta:&nbsp;<strong>USER<\/strong>,&nbsp;<strong>PASSWORD<\/strong>,&nbsp;<strong>HOST&nbsp;<\/strong>e&nbsp;<strong>PORT<\/strong>. Todos s&atilde;o configurados no arquivo<strong>&nbsp;settings.py<\/strong>, na se&ccedil;&atilde;o&nbsp;<strong>DATABASES<\/strong>:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': 'mydatabase',\n        'USER': 'mydatabaseuser',\n        'PASSWORD': 'mypassword',\n        'HOST': 'localhost',\n        'PORT': '5432',\n    }\n}<\/pre><p><strong>Diferen&ccedil;as:&nbsp;<\/strong>Ao contr&aacute;rio do SQLite, o PostgreSQL &eacute; um banco de dados com recursos completos e que suporta v&aacute;rios usu&aacute;rios simult&acirc;neos, consultas avan&ccedil;adas e transa&ccedil;&otilde;es. Para utilizar esse banco, &eacute; necess&aacute;rio&nbsp;<a href=\"\/pt\/tutoriais\/instalar-postgresql-ubuntu\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>instalar o PostgreSQL<\/strong><\/a><strong>&nbsp;<\/strong>no servidor, criar um banco de dados e um usu&aacute;rio, e fazer configura&ccedil;&otilde;es mais complexas.<\/p><ul class=\"wp-block-list\">\n<li><strong>MySQL \/ MariaDB<\/strong>: Ambos s&atilde;o bancos de dados relacionais r&aacute;pidos e confi&aacute;veis, amplamente usados no desenvolvimento web. O MySQL &eacute; conhecido por sua velocidade, enquanto o MariaDB, um fork do MySQL, &eacute; mais focado no desenvolvimento dirigido pela comunidade (community-driven development) e &eacute; totalmente compat&iacute;vel com o MySQL. Esses bancos de dados s&atilde;o excelentes para&nbsp;<strong>aplica&ccedil;&otilde;es web de alto tr&aacute;fego<\/strong>&nbsp;e geralmente s&atilde;o preferidos por seu desempenho.<br><br><strong>Configura&ccedil;&atilde;o:&nbsp;<\/strong>O MySQL e o MariaDB usam o pacote&nbsp;<strong>mysqlclient&nbsp;<\/strong>para fazer interface com o Django.<br><strong><br>Configura&ccedil;&atilde;o:&nbsp;<\/strong>Ambos usam os mesmos par&acirc;metros do PostgreSQL, configurados no arquivo&nbsp;<strong>settings.py<\/strong>, na se&ccedil;&atilde;o&nbsp;<strong>DATABASES<\/strong>:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.mysql',  # or 'django.db.backends.mariadb' for MariaDB\n        'NAME': 'mydatabase',\n        'USER': 'mydatabaseuser',\n        'PASSWORD': 'mypassword',\n        'HOST': 'localhost',\n        'PORT': '3306',\n    }\n}<\/pre><p><strong>Diferen&ccedil;as:&nbsp;<\/strong>O MySQL e o MariaDB s&atilde;o conhecidos por seu desempenho com grandes conjuntos de dados e aplica&ccedil;&otilde;es web de alto tr&aacute;fego. Eles suportam v&aacute;rios mecanismos de armazenamento, leituras r&aacute;pidas e podem lidar com milh&otilde;es de queries de forma r&aacute;pida.<\/p><ul class=\"wp-block-list\">\n<li><strong>Oracle \/ Microsoft SQL Server<\/strong>: Esses bancos de dados s&atilde;o de n&iacute;vel empresarial e oferecem uma pot&ecirc;ncia significativa, especialmente para projetos como grandes aplicativos. No entanto, sua configura&ccedil;&atilde;o &eacute; mais complexa e, em geral, s&atilde;o usados apenas em&nbsp;<strong>ambientes empresariais&nbsp;<\/strong>espec&iacute;ficos onde a empresa j&aacute; usa o Oracle ou o SQL Server para outros softwares.<br><br><strong>Configura&ccedil;&atilde;o:<\/strong>&nbsp;Ambos exigem drivers adicionais para fazer integra&ccedil;&atilde;o com o Django, como&nbsp;<strong>cx_Oracle<\/strong>&nbsp;para o Oracle e&nbsp;<strong>pyodbc&nbsp;<\/strong>para o SQL Server. Esses bancos de dados costumam ser usados em ambientes empresariais nos quais outros softwares de neg&oacute;cios j&aacute; dependem desses sistemas.<br><br><strong>Configura&ccedil;&atilde;o:&nbsp;<\/strong>Cada um desses sistemas requer processos de configura&ccedil;&atilde;o distintos e mais complexos, incluindo instala&ccedil;&atilde;o, a configura&ccedil;&atilde;o de drivers e a estrutura&ccedil;&atilde;o de credenciais de banco de dados no<strong>&nbsp;<\/strong>arquivo&nbsp;<strong>settings.py<\/strong>, assim como nas op&ccedil;&otilde;es anteriores.<br><br><strong>Diferen&ccedil;as:&nbsp;<\/strong>O Oracle e o SQL Server oferecem recursos de n&iacute;vel empresarial, como tratamento avan&ccedil;ado de transa&ccedil;&otilde;es, desempenho otimizado e integra&ccedil;&atilde;o com sistemas de grande escala. O processo de configura&ccedil;&atilde;o &eacute; mais complexo e geralmente &eacute; feito por administradores de banco de dados profissionais.<\/li>\n<\/ul><p>Agora, vamos simplificar e esclarecer os detalhes para voc&ecirc; poder escolher o melhor banco de dados para desenvolver seu projeto Django:<\/p><ul class=\"wp-block-list\">\n<li><strong>Desenvolvimento e teste:&nbsp;<\/strong>Use o SQLite. Ele &eacute; simples, n&atilde;o precisa de configura&ccedil;&atilde;o adicional e &eacute; ideal para testes locais.<\/li>\n\n\n\n<li><strong>Produ&ccedil;&atilde;o em pequena escala:&nbsp;<\/strong>Para aplica&ccedil;&otilde;es web menores e de tr&aacute;fego moderado, voc&ecirc; pode escolher o MySQL ou o MariaDB, j&aacute; que eles oferecem um desempenho melhor do que o SQLite e t&ecirc;m uma curva de aprendizado mais f&aacute;cil do que o PostgreSQL.<\/li>\n\n\n\n<li><strong>Produ&ccedil;&atilde;o em larga escala:<\/strong>&nbsp;O PostgreSQL &eacute; o mais recomendado para projetos Django que exigem capacidade de expans&atilde;o, seguran&ccedil;a e recursos avan&ccedil;ados.<\/li>\n\n\n\n<li><strong>Ambientes corporativos:&nbsp;<\/strong>Se voc&ecirc; trabalha em um ambiente corporativo que usa Oracle ou SQL Server para outros aplicativos, esses bancos de dados podem ser a melhor op&ccedil;&atilde;o devido aos requisitos de integra&ccedil;&atilde;o.<\/li>\n<\/ul><p><strong>Configurando PostgreSQL com Django<\/strong><\/p><p>Nesta se&ccedil;&atilde;o, vamos apresentar o processo de integra&ccedil;&atilde;o do&nbsp;<strong>PostgreSQL&nbsp;<\/strong>com o Django, j&aacute; que ele &eacute; um dos bancos de dados mais usados para desenvolvimento de aplica&ccedil;&otilde;es.<\/p><ol class=\"wp-block-list\">\n<li><strong>Instale o PostgreSQL:&nbsp;<\/strong>Para integrar o PostgreSQL com o framework Django, o primeiro passo &eacute; instalar o PostgreSQL em seu sistema:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt update<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install postgresql postgresql-contrib<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Instale o adaptador do PostgreSQL para Django:&nbsp;<\/strong>O Django usa o&nbsp;<strong>psycopg2&nbsp;<\/strong>para se integrar com o PostgreSQL. Instale o pacote usando&nbsp;<strong>pip<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install psycopg2<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Mude para o usu&aacute;rio do PostgreSQL:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo -u postgres psql<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Crie um novo banco de dados:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">CREATE DATABASE mydatabase;<\/pre><ol start=\"5\" class=\"wp-block-list\">\n<li>Crie um usu&aacute;rio e senha:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">CREATE USER mydatabaseuser WITH PASSWORD 'mypassword';<\/pre><p>Conceda todos os privil&eacute;gios do banco de dados ao usu&aacute;rio rec&eacute;m criado&nbsp;<strong>mydatabaseuser<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydatabaseuser;<\/pre><p>Saia do shell do PostgreSQL:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">q<\/pre><ol start=\"6\" class=\"wp-block-list\">\n<li><strong>Configure o Django para usar o PostgreSQL:&nbsp;<\/strong>Abra o arquivo<strong>&nbsp;settings.py<\/strong>&nbsp;e localize a se&ccedil;&atilde;o&nbsp;<strong>DATABASES<\/strong>. Para modificar a configura&ccedil;&atilde;o e usar o PostgreSQL, insira:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': 'mydatabase',\n        'USER': 'mydatabaseuser',\n        'PASSWORD': 'mypassword',\n        'HOST': 'localhost',  # Use '127.0.0.1' if 'localhost' doesn't work\n        'PORT': '5432',       # Default PostgreSQL port\n    }\n}<\/pre><ol start=\"7\" class=\"wp-block-list\">\n<li>Lembre-se de substituir&nbsp;<strong>PASSWORD<\/strong>&nbsp;e&nbsp;<strong>USER<\/strong>&nbsp;com a senha e usu&aacute;rio que voc&ecirc; criou no&nbsp;<strong>Passo 5<\/strong>.<\/li>\n\n\n\n<li><strong>Aplique as migra&ccedil;&otilde;es:&nbsp;<\/strong>Agora que seu banco de dados est&aacute; criado e integrado, &eacute; preciso aplicar as migra&ccedil;&otilde;es do seu projeto para configurar as tabelas necess&aacute;rias no PostgreSQL:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;migrate<\/pre><p>Esse comando cria as tabelas necess&aacute;rias em seu banco de dados PostgreSQL.<\/p><ol start=\"9\" class=\"wp-block-list\">\n<li><strong>Teste a conex&atilde;o:&nbsp;<\/strong>Por fim, execute o servidor atrav&eacute;s do comando&nbsp;<strong>runserver&nbsp;<\/strong>para verificar se a integra&ccedil;&atilde;o do Django com o PostgreSQL foi bem-sucedida:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;runserver<\/pre><p>Acesse a URL&nbsp;<strong>http:\/\/127.0.0.1:8000\/<\/strong>&nbsp;em seu navegador. Se a p&aacute;gina de boas-vindas do Django for exibida, quer dizer que a conex&atilde;o com o banco de dados est&aacute; funcionando corretamente.<\/p><p>Com seu banco de dados PostgreSQL totalmente integrado, o framework Django poder&aacute; lidar com bases de dados maiores e mais complexas, permitindo a expans&atilde;o do seu projeto.<\/p><h2 class=\"wp-block-heading\" id=\"h-construindo-visualizacoes-views-e-modelos-templates\"><strong>Construindo visualiza&ccedil;&otilde;es (views) e modelos (templates)<\/strong><\/h2><p>Com o banco de dados e os modelos de gerenciamento configurados, o pr&oacute;ximo passo &eacute; exibir essas informa&ccedil;&otilde;es aos usu&aacute;rios e criar interfaces interativas.<\/p><p>&Eacute; nessa etapa que as Views (exibi&ccedil;&otilde;es) e os Templates (modelos) atuam, definindo a l&oacute;gica e a estrutura por tr&aacute;s das p&aacute;ginas com as quais os usu&aacute;rios v&atilde;o interagir.<\/p><h3 class=\"wp-block-heading\" id=\"h-entendendo-as-visualizacoes\"><strong>Entendendo as visualiza&ccedil;&otilde;es<\/strong><\/h3><p>No Django, as&nbsp;<strong>views&nbsp;<\/strong>representam um componente essencial que define a l&oacute;gica por tr&aacute;s do que o usu&aacute;rio v&ecirc; quando interage com a sua aplica&ccedil;&atilde;o.<\/p><p>Em termos simples, uma visualiza&ccedil;&atilde;o recebe e processa uma solicita&ccedil;&atilde;o vinda de um usu&aacute;rio da internet e retorna uma resposta, normalmente na forma de uma p&aacute;gina HTML renderizada. Com o uso de modelos e templates, as exibi&ccedil;&otilde;es fazem a ponte entre o banco de dados e a interface que o usu&aacute;rio v&ecirc;.<\/p><p>Dois tipos principais de visualiza&ccedil;&otilde;es no Djang s&atilde;o as&nbsp;<strong>Views baseadas em fun&ccedil;&otilde;es (FBVs)<\/strong>&nbsp;e as&nbsp;<strong>Views baseadas em classes (CBVs)<\/strong>. Ambas t&ecirc;m o mesmo prop&oacute;sito, mas organizam o c&oacute;digo de programa&ccedil;&atilde;o de maneiras diferentes.<\/p><p><strong>Function-Based Views (FBVs)<\/strong><\/p><p>As visualiza&ccedil;&otilde;es FBVs s&atilde;o fun&ccedil;&otilde;es Python b&aacute;sicas que aceitam um objeto de solicita&ccedil;&atilde;o e retornam uma resposta. Elas costumam ser usadas para casos de navega&ccedil;&atilde;o mais simples ou quando voc&ecirc; precisa de mais controle sobre o fluxo do processo.<\/p><p>Abaixo indicamos um exemplo de uma FBV que renderiza um template HTML:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.shortcuts import render\n\n# Function-based view\ndef homepage(request):\n    return render(request, 'homepage.html')<\/pre><p>Neste exemplo:<\/p><ul class=\"wp-block-list\">\n<li><strong>request:&nbsp;<\/strong>A solicita&ccedil;&atilde;o HTTP enviada pelo navegador do usu&aacute;rio.<\/li>\n\n\n\n<li><strong>render<\/strong>: Combina o template&nbsp;<strong>homepage.html<\/strong>&nbsp;com qualquer dado de contexto fornecido e retorna uma resposta HTTP.<\/li>\n<\/ul><p>As FBVs s&atilde;o f&aacute;ceis de entender e de implementar, mas, &agrave; medida que as views se tornam mais complexas, envolvendo formul&aacute;rios ou autentica&ccedil;&atilde;o, elas podem se tornar mais dif&iacute;ceis de manter.<\/p><p><strong>Class-Based Views (CBVs)<\/strong><\/p><p>As visualiza&ccedil;&otilde;es baseadas em classe, por outro lado, permitem que voc&ecirc; estruture as views de forma mais eficiente atrav&eacute;s de princ&iacute;pios de programa&ccedil;&atilde;o orientada a objetos. Por serem baseadas em classes Python, as CBVs s&atilde;o mais flex&iacute;veis e reutiliz&aacute;veis.<\/p><p>O Django fornece views gen&eacute;ricas incorporadas, como&nbsp;<strong>ListView&nbsp;<\/strong>e&nbsp;<strong>DetailView<\/strong>, que tratam de casos mais comuns. Essas views permitem que voc&ecirc; se concentre mais em personaliz&aacute;-las em vez de reescrever l&oacute;gicas repetitivas.<\/p><p>Veja um exemplo de CBV que executa a mesma fun&ccedil;&atilde;o que o FBV anterior:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import TemplateView\n\n# Class-based view\nclass HomePageView(TemplateView):\n    template_name = 'homepage.html'<\/pre><p>Neste exemplo:<\/p><ul class=\"wp-block-list\">\n<li><strong>TemplateView:&nbsp;<\/strong>Uma visualiza&ccedil;&atilde;o gen&eacute;rica incorporada que renderiza um template.<\/li>\n\n\n\n<li><strong>template_name<\/strong>: especifica o arquivo de template a ser renderizado.<\/li>\n<\/ul><p>Para usar esse CBV e configurar uma URL, voc&ecirc; precisa incluir o m&eacute;todo&nbsp;<strong>.as_view()<\/strong>&nbsp;ao adicion&aacute;-lo ao&nbsp;<strong>urls.py<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom .views import HomePageView\n\nurlpatterns = [\n    path('', HomePageView.as_view(), name='home'),\n]<\/pre><p><strong>Quando usar FBVs e quando usar CBVs<\/strong><\/p><ul class=\"wp-block-list\">\n<li><strong>Use FBVs&nbsp;<\/strong>quando precisar de simplicidade e controle total sobre a l&oacute;gica de visualiza&ccedil;&atilde;o. As views baseadas em fun&ccedil;&otilde;es costumam ser mais intuitivas para views n&atilde;o complexas ou para l&oacute;gicas personalizadas que n&atilde;o se encaixam nos padr&otilde;es de visualiza&ccedil;&atilde;o predefinidos pelo Django.<\/li>\n\n\n\n<li><strong>Use CBVs&nbsp;<\/strong>quando voc&ecirc; quiser seguir os princ&iacute;pios<strong>&nbsp;DRY (Don&rsquo;t Repeat Yourself)<\/strong>&nbsp;e reutilizar a l&oacute;gica existente. As CBVs s&atilde;o ideais quando as views aumentam em complexidade, como ao lidar com formul&aacute;rios, dados paginados ou opera&ccedil;&otilde;es CRUD padr&atilde;o.<\/li>\n<\/ul><p>Tanto as visualiza&ccedil;&otilde;es FBVs quanto CBVs s&atilde;o partes constituintes do Django, e a escolha entre eles depende dos requisitos do seu projeto e da sua prefer&ecirc;ncia pessoal.<\/p><h3 class=\"wp-block-heading\" id=\"h-trabalhando-com-templates\"><strong>Trabalhando com templates<\/strong><\/h3><p>O sistema de templates, ou modelos, do Django foi projetado para separar a apresenta&ccedil;&atilde;o dos dados da l&oacute;gica subjacente a ela. Templates s&atilde;o essencialmente arquivos HTML que cont&ecirc;m conte&uacute;dos din&acirc;micos, permitindo exibir os dados processados a partir das views. Para inserir dados din&acirc;micos numa p&aacute;gina HTML, a Django Template Language (DTL) oferece placeholders (textos de preenchimento) e l&oacute;gicas de visualiza&ccedil;&atilde;o, como loops e condicionais.<\/p><p>Os templates desempenham um papel central na apar&ecirc;ncia das p&aacute;ginas web, mantendo uma separa&ccedil;&atilde;o clara entre a l&oacute;gica, que &eacute; tratada pelas views, e a interface do usu&aacute;rio.<\/p><p><strong>Criando um Template<\/strong><\/p><p>Para usar um template no Django, voc&ecirc; precisa criar um arquivo HTML dentro do diret&oacute;rio chamado&nbsp;<strong>templates<\/strong>. Abaixo apresentamos um exemplo da estrutura do diret&oacute;rio:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">myproject\/\n&#9474;\n&#9500;&#9472;&#9472; myapp\/\n&#9474;   &#9500;&#9472;&#9472; templates\/\n&#9474;   &#9474;   &#9492;&#9472;&#9472; myapp\/\n&#9474;   &#9474;       &#9492;&#9472;&#9472; homepage.html\n&#9474;   &#9492;&#9472;&#9472; views.py\n&#9474;\n&#9492;&#9472;&#9472; manage.py<\/pre><p>Na estrutura acima, o Django procura automaticamente por templates dentro do diret&oacute;rio&nbsp;<strong>templates&nbsp;<\/strong>do seu app. Voc&ecirc; pode organizar ainda mais os templates dentro de pastas espec&iacute;ficas da sua aplica&ccedil;&atilde;o (como&nbsp;<strong>myapp\/homepage.html<\/strong>), garantindo que cada aplica&ccedil;&atilde;o ter&aacute; seus pr&oacute;prios templates.<\/p><p>Confira um exemplo de um template simples para p&aacute;gina inicial (<strong>homepage.html<\/strong>):<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;Home&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;Welcome to {{ site_name }}&lt;\/h1&gt;\n    &lt;p&gt;{{ message }}&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre><p>Neste template,&nbsp;<strong>{{ site_name }}<\/strong>&nbsp;e&nbsp;<strong>{{ message }}<\/strong>&nbsp;s&atilde;o placeholders que ser&atilde;o preenchidos com dados din&acirc;micos a partir da view.<\/p><p><strong>Renderizando um template em uma view<\/strong><\/p><p>Para renderizar um template para a visualiza&ccedil;&atilde;o dos usu&aacute;rios, &eacute; preciso usar a fun&ccedil;&atilde;o&nbsp;<strong>render()<\/strong>&nbsp;do Django. Abaixo indicamos como renderizar o template&nbsp;<strong>homepage.html<\/strong>&nbsp;com alguns dados de contexto em uma view baseada em fun&ccedil;&atilde;o &ndash;&nbsp;<strong>function-based view (FBV):<\/strong><\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.shortcuts import render\n\ndef homepage(request):\n    context = {\n        'site_name': 'My Django Website',\n        'message': 'This is the homepage content!'\n    }\n    return render(request, 'myapp\/homepage.html', context)<\/pre><p>Neste exemplo:<\/p><ul class=\"wp-block-list\">\n<li><strong>render()<\/strong>: Combina o template (<strong>homepage.html<\/strong>) com os dados de contexto.<\/li>\n\n\n\n<li><strong>context<\/strong>: Um dicion&aacute;rio contendo os dados de nome e mensagem (<strong>site_name<\/strong>&nbsp;and&nbsp;<strong>message<\/strong>), que ser&atilde;o inseridos no template.&nbsp;<\/li>\n<\/ul><p>Quando um usu&aacute;rio acessar a p&aacute;gina, os placeholders&nbsp;<strong>{{ site_name }}<\/strong>&nbsp;e&nbsp;<strong>{{ message }}<\/strong>&nbsp;do template ser&atilde;o substitu&iacute;dos por &ldquo;My Django Website&rdquo; e &ldquo;This is the homepage content!&rdquo;, respectivamente.<\/p><p><strong>Tags e filtros de template<\/strong><\/p><p>Os templates do Django tamb&eacute;m suportam&nbsp;<strong>tags<\/strong>&nbsp;e&nbsp;<strong>filtros<\/strong>, que permitem adicionar conte&uacute;dos din&acirc;micos e l&oacute;gicas de visualiza&ccedil;&atilde;o dentro de arquivos HTML.<\/p><ul class=\"wp-block-list\">\n<li><strong>Template Tags<\/strong>: Executam a l&oacute;gica dentro dos templates, como loops e condicionais. Por exemplo, uma condi&ccedil;&atilde;o &ldquo;se&rdquo;&nbsp;<strong>(if condition)<\/strong>:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{% if user.is_authenticated %}\n    &lt;p&gt;Welcome back, {{ user.username }}!&lt;\/p&gt;\n{% else %}\n    &lt;p&gt;Hello, Guest!&lt;\/p&gt;\n{% endif %}<\/pre><ul class=\"wp-block-list\">\n<li><strong>Filtros de Template<\/strong>: Modificam vari&aacute;veis de exibi&ccedil;&atilde;o. Por exemplo, &eacute; poss&iacute;vel definir datas com um filtro:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;p&gt;Published on {{ article.published_date|date:\"F j, Y\" }}&lt;\/p&gt;<\/pre><p><strong>Estendendo templates<\/strong><\/p><p>O Django suporta&nbsp;<strong>heran&ccedil;a de templates<\/strong>, isso &eacute;, &eacute; poss&iacute;vel criar templates-base que podem ser usados para criar outros templates (extend template). Esse recurso &eacute; &uacute;til para manter um layout consistente em todas as p&aacute;ginas, como cabe&ccedil;alhos e rodap&eacute;s padr&atilde;o.<\/p><ol class=\"wp-block-list\">\n<li>Crie um template-base (<strong>base.html<\/strong>):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;{% block title %}My Site{% endblock %}&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;header&gt;\n        &lt;h1&gt;Site Header&lt;\/h1&gt;\n    &lt;\/header&gt;\n\n    &lt;main&gt;\n        {% block content %}\n        &lt;!-- Page-specific content goes here --&gt;\n        {% endblock %}\n    &lt;\/main&gt;\n\n    &lt;footer&gt;\n        &lt;p&gt;Footer Content&lt;\/p&gt;\n    &lt;\/footer&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Estenda o template base em um novo template (<strong>homepage.html<\/strong>):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{% extends 'base.html' %}\n\n{% block title %}Home Page{% endblock %}\n\n{% block content %}\n    &lt;h2&gt;Welcome to the homepage!&lt;\/h2&gt;\n    &lt;p&gt;This is the homepage content.&lt;\/p&gt;\n{% endblock %}<\/pre><p>Ao estender o template base, voc&ecirc; pode reutilizar o cabe&ccedil;alho e o rodap&eacute; em diferentes p&aacute;ginas, garantindo um layout consistente sem precisar fazer repeti&ccedil;&otilde;es.<\/p><p><strong>Usando arquivos est&aacute;ticos em templates<\/strong><\/p><p>Os templates tamb&eacute;m permitem referenciar arquivos est&aacute;ticos (como CSS, JavaScript ou imagens) usando a tag<strong>&nbsp;{% static %}<\/strong>. Por exemplo, para incluir um arquivo CSS:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"{% static 'css\/style.css' %}\"&gt;<\/pre><p>Lembre-se de configurar corretamente os diret&oacute;rios de arquivos est&aacute;ticos no&nbsp;<strong>settings.py<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">STATIC_URL = '\/static\/'<\/pre><p>Utilizando o sistema de templates do Django, voc&ecirc; pode criar p&aacute;ginas din&acirc;micas e baseadas em dados, mantendo uma separa&ccedil;&atilde;o limpa entre a l&oacute;gica ou estrutura e a apresenta&ccedil;&atilde;o ou visualiza&ccedil;&atilde;o.<\/p><h2 class=\"wp-block-heading\" id=\"h-trabalhando-com-padroes-de-url\"><strong>Trabalhando com Padr&otilde;es de URL<\/strong><\/h2><p>O dispatcher de URL do Django se baseia em express&otilde;es regulares ou conversores de caminho (convert-path) para combinar solicita&ccedil;&otilde;es de URL com views espec&iacute;ficas. Esses padr&otilde;es de URL s&atilde;o definidos no diret&oacute;rio&nbsp;<strong>urls.py<\/strong>, e o Django usa essa configura&ccedil;&atilde;o para determinar qual view deve responder &agrave; requisi&ccedil;&atilde;o.<\/p><p>Cada projeto Django costuma ter dois n&iacute;veis de configura&ccedil;&atilde;o de URL:<\/p><ul class=\"wp-block-list\">\n<li><strong>URLs a n&iacute;vel do projeto:&nbsp;<\/strong>Definido no arquivo raiz<strong>&nbsp;urls.py&nbsp;<\/strong>(localizado no diret&oacute;rio principal do projeto), esse arquivo cont&eacute;m a estrutura geral do roteamento de URLs do projeto.<\/li>\n\n\n\n<li><strong>URLs a n&iacute;vel do app:&nbsp;<\/strong>Cada aplica&ccedil;&atilde;o dentro do seu projeto pode ter seu pr&oacute;prio arquivo&nbsp;<strong>urls.py<\/strong>, permitindo o gerenciamento modular de URLs. Estas URLs ao n&iacute;vel da aplica&ccedil;&atilde;o s&atilde;o posteriormente conectadas &agrave;s URLs a n&iacute;vel do projeto.<\/li>\n<\/ul><p><strong>Configura&ccedil;&atilde;o b&aacute;sica de URL<\/strong><\/p><p>Veja um exemplo de como configurar padr&otilde;es de URL em um projeto simples:<\/p><ol class=\"wp-block-list\">\n<li>URLs a n&iacute;vel de projeto (<strong>myproject&rarr;urls.py<\/strong>)<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.contrib import admin\nfrom django.urls import path, include\nurlpatterns = [\n    path('admin\/', admin.site.urls),  # Admin site\n    path('', include('myapp.urls')),  # Include app-level URLs for \"myapp\"\n\n]<\/pre><ul class=\"wp-block-list\">\n<li><strong>path()<\/strong>: A fun&ccedil;&atilde;o de caminho do Django para definir padr&otilde;es de URL.<\/li>\n\n\n\n<li><strong>admin.site.urls<\/strong>: Lida com todas as requisi&ccedil;&otilde;es relacionadas &agrave; administra&ccedil;&atilde;o da aplica&ccedil;&atilde;o.<\/li>\n\n\n\n<li><strong>include()<\/strong>: Fun&ccedil;&atilde;o usada para incluir URLs a n&iacute;vel da aplica&ccedil;&atilde;o (a partir do diret&oacute;rio myapp.urls) nas configura&ccedil;&otilde;es principais do projeto.<\/li>\n<\/ul><ol start=\"2\" class=\"wp-block-list\">\n<li>URLs a n&iacute;vel da aplica&ccedil;&atilde;o (<strong>myproject&rarr;myapp&rarr;urls.py<\/strong>)<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom . import views\n\nurlpatterns = [\n    path('', views.homepage, name='home'),  # Maps the root URL to the homepage view\n    path('about\/', views.about, name='about'),  # Maps \"\/about\/\" to the about view\n\n]<\/pre><ul class=\"wp-block-list\">\n<li>A&nbsp;<strong>URL raiz<\/strong>&nbsp;(<strong>root URL,&nbsp;<\/strong>representado por &lsquo; &lsquo;) faz refer&ecirc;ncia &agrave; view da p&aacute;gina inicial.<\/li>\n\n\n\n<li>A URL&nbsp;<strong>\/about\/ URL<\/strong>&nbsp;faz refer&ecirc;ncia &agrave; view da p&aacute;gina&nbsp;<strong>sobre<\/strong>&nbsp;(about)<\/li>\n<\/ul><p><strong>Roteamento de URL com views baseadas em fun&ccedil;&otilde;es (FBVs)<\/strong><\/p><p>Abaixo demonstramos como as views correspondentes &agrave;s configura&ccedil;&otilde;es de URL acima podem aparecer no arquivo&nbsp;<strong>views.py<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.shortcuts import render\n\ndef homepage(request):\n    return render(request, 'homepage.html')\n\ndef about(request):\n    return render(request, 'about.html')<\/pre><p>Esta configura&ccedil;&atilde;o conecta as URLs&nbsp;<strong>homepage<\/strong>&nbsp;e&nbsp;<strong>about<\/strong>&nbsp;&agrave;s suas respectivas views, garantindo que quando um usu&aacute;rio visita as URLs&nbsp;<strong>http:\/\/example.com\/&nbsp;<\/strong>ou<strong>&nbsp;http:\/\/example.com\/about\/<\/strong>, a p&aacute;gina renderiza e exibe o template correto.<\/p><p><strong>Roteamento de URL com views baseadas em classes (CBVs)<\/strong><\/p><p>Tamb&eacute;m &eacute; poss&iacute;vel mapear URLs para visualiza&ccedil;&otilde;es class-based (CBVs), que exigem uma configura&ccedil;&atilde;o um pouco diferente. Abaixo indicamos um exemplo de mapping de URL CBV:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom .views import HomePageView, AboutPageView\n\nurlpatterns = [\n    path('', HomePageView.as_view(), name='home'),\n    path('about\/', AboutPageView.as_view(), name='about'),\n]<\/pre><p>Respectivamente, confira como se estruturam as visualiza&ccedil;&otilde;es baseadas em classe no arquivo&nbsp;<strong>views.py:<\/strong><\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import TemplateView\n\nclass HomePageView(TemplateView):\n    template_name = 'homepage.html'\n\nclass AboutPageView(TemplateView):\n    template_name = 'about.html'<\/pre><p>Neste caso, o m&eacute;todo<strong>&nbsp;.as_view()&nbsp;<\/strong>&eacute; utilizado para conectar as views baseadas em classes aos padr&otilde;es de URL determinados.<\/p><p><strong>Par&acirc;metros de URL e roteamento din&acirc;mico<\/strong><\/p><p>O framework Django tamb&eacute;m permite capturar par&acirc;metros de URL e pass&aacute;-los para as views, recurso especialmente &uacute;til no mapeamento de URLs din&acirc;micas, como em blog posts ou p&aacute;ginas de produtos em lojas virtuais.<\/p><p>Aqui est&aacute; um exemplo no qual a URL se conecta a um par&acirc;metro integer, ou inteiro:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom . import views\n\nurlpatterns = [\n    path('article\/&lt;int:id&gt;\/', views.article_detail, name='article_detail'),\n]<\/pre><p>Neste caso, a fun&ccedil;&atilde;o&nbsp;<strong>&lt;int:id&gt;<\/strong>&nbsp;captura o&nbsp;integer&nbsp;a partir da URL e o passa para a view&nbsp;<strong>article_detail&nbsp;<\/strong>como um argumento:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def article_detail(request, id):\n    # Fetch the article using the provided ID\n    article = get_object_or_404(Article, pk=id)\n    return render(request, 'article_detail.html', {'article': article})<\/pre><p>Se um usu&aacute;rio visitar a URL&nbsp;<strong>http:\/\/example.com\/article\/5\/<\/strong>, o Django passar&aacute;<strong>&nbsp;5<\/strong>&nbsp;como o argumento&nbsp;<strong>id&nbsp;<\/strong>para a view&nbsp;<strong>article_detail<\/strong>, permitindo que o servidor localize e exiba o artigo espec&iacute;fico.<\/p><p><strong>Padr&otilde;es de URL nomeados<\/strong><\/p><p>&Eacute; uma boa pr&aacute;tica&nbsp;<strong>nomear&nbsp;<\/strong>seus padr&otilde;es de URL. Isto permite referenciar as URLs pelos seus nomes nos modelos e views em vez de ter que codificar os padr&otilde;es repetitivamente.<\/p><p>No exemplo&nbsp;<strong>urls.py<\/strong>&nbsp;acima, cada URL tem um argumento de&nbsp;<strong>nome<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">path('about\/', views.about, name='about')<\/pre><p>Em seus templates, voc&ecirc; pode usar a tag de template&nbsp;<strong>{% url %}<\/strong>&nbsp;para fazer refer&ecirc;ncia &agrave;s URLs nomeadas:&nbsp;<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;a href=\"{% url 'about' %}\"&gt;Sobre N&oacute;s&lt;\/a&gt;<\/pre><p>Dessa forma, se a URL&nbsp;<strong>about&nbsp;<\/strong>mudar, voc&ecirc; s&oacute; precisa atualizar o endere&ccedil;o na configura&ccedil;&atilde;o da URL e n&atilde;o em cada um dos templates.<\/p><p>Ao configurar e trabalhar com padr&otilde;es de URL no Django, voc&ecirc; pode rastrear diferentes URLs para suas respectivas views. Essa flexibilidade permite que voc&ecirc; apresente tanto p&aacute;ginas est&aacute;ticas simples quanto conte&uacute;dos mais complexos e din&acirc;micos que variam de acordo com o input do usu&aacute;rio.<\/p><h2 class=\"wp-block-heading\" id=\"h-gerenciando-arquivos-estaticos-no-django\"><strong>Gerenciando Arquivos Est&aacute;ticos no Django<\/strong><\/h2><p>Agora que voc&ecirc; j&aacute; sabe como configurar views, templates, e padr&otilde;es de URL, para construir uma aplica&ccedil;&atilde;o Django totalmente funcional, tamb&eacute;m &eacute; preciso gerenciar&nbsp;<strong>arquivos est&aacute;ticos<\/strong>&nbsp;como CSS, JavaScript e imagens.<\/p><p>Felizmente, o framework Django oferece formas simples e eficientes de gerenciar arquivos est&aacute;ticos, garantindo que eles sejam organizados e exibidos corretamente durante o desenvolvimento e lan&ccedil;amento da aplica&ccedil;&atilde;o.<\/p><p><strong>Configurando arquivos est&aacute;ticos no Django<\/strong><\/p><p>Para gerenciar arquivos est&aacute;ticos no Django, voc&ecirc; precisa configurar seu projeto para ele saber onde procurar e exibir tais arquivos.<\/p><p>Defina a URL est&aacute;tica e o Diret&oacute;rio em<strong>&nbsp;settings.py<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># settings.py\nSTATIC_URL = '\/static\/'\nSTATICFILES_DIRS = [\n    BASE_DIR \/ \"static\",  # Optional: Add this if you want to store static files in a 'static' folder within your project\n]<\/pre><ul class=\"wp-block-list\">\n<li><strong>STATIC_URL<\/strong>: Define o prefixo da URL que o Django deve usar quando retornar arquivos est&aacute;ticos &agrave;s solicita&ccedil;&otilde;es.<\/li>\n\n\n\n<li><strong>STATICFILES_DIRS<\/strong>: Define diret&oacute;rios adicionais nos quais o Django ir&aacute; localizar arquivos est&aacute;ticos durante o desenvolvimento do projeto.<\/li>\n<\/ul><p>Por padr&atilde;o, o Django tamb&eacute;m procura arquivos est&aacute;ticos dentro do diret&oacute;rio est&aacute;tico (<strong>static<\/strong>) de cada aplica&ccedil;&atilde;o. Por exemplo, se voc&ecirc; tem um app chamado&nbsp;<strong>myapp<\/strong>, &eacute; poss&iacute;vel criar uma estrutura de pastas como essa:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">myapp\/\n&#9474;\n&#9500;&#9472;&#9472; static\/\n&#9474;   &#9492;&#9472;&#9472; myapp\/\n&#9474;       &#9492;&#9472;&#9472; style.css\n&#9492;&#9472;&#9472; views.py<\/pre><p>O Django automaticamente reconhece e serve esses arquivos durante o desenvolvimento.<\/p><p><strong>Usando arquivos est&aacute;ticos em templates<\/strong><\/p><p>Para usar arquivos est&aacute;ticos em seus templates, o primeiro passo &eacute; carregar a tag de template<strong>&nbsp;{% static %}&nbsp;<\/strong>do Django. Depois, voc&ecirc; pode referenciar seus arquivos est&aacute;ticos pelos seus respectivos caminhos (paths):<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;Home Page&lt;\/title&gt;\n    {% load static %}\n    &lt;link rel=\"stylesheet\" href=\"{% static 'myapp\/style.css' %}\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;Welcome to My Django App&lt;\/h1&gt;\n    &lt;img src=\"{% static 'myapp\/images\/logo.png' %}\" alt=\"Logo\"&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre><p>Nesse exemplo:<\/p><ul class=\"wp-block-list\">\n<li><strong>{% load static %}<\/strong>: Carrega a tag de template dos arquivos est&aacute;ticos.<\/li>\n\n\n\n<li><strong>{% static &lsquo;myapp\/style.css&rsquo; %}<\/strong>: Indica o caminho para o arquivo style.css no diret&oacute;rio static\/myapp.<\/li>\n\n\n\n<li><strong>{% static &lsquo;myapp\/images\/logo.png&rsquo; %}<\/strong>: Resolve o caminho para um arquivo de imagem.<\/li>\n<\/ul><p><strong>Coletando arquivos est&aacute;ticos para deployment<\/strong><\/p><p>Durante o desenvolvimento, o Django serve arquivos est&aacute;ticos automaticamente quando<strong>&nbsp;DEBUG = True<\/strong>. No entanto, em produ&ccedil;&atilde;o, o Django n&atilde;o serve arquivos est&aacute;ticos de forma autom&aacute;tica. Nesse caso, &eacute; preciso coletar todos os arquivos est&aacute;ticos de v&aacute;rios locais e armazen&aacute;-los em um &uacute;nico diret&oacute;rio.<\/p><p>Para fazer isso, utilize o comando de gerenciamento&nbsp;<strong>collectstatic<\/strong>:<\/p><ol class=\"wp-block-list\">\n<li>O comando&nbsp;<strong>django.contrib.staticfiles<\/strong>&nbsp;deve estar inclu&iacute;do na configura&ccedil;&atilde;o&nbsp;<strong>INSTALLED_APPS<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">INSTALLED_APPS = [\n    # Other installed apps\n    'django.contrib.staticfiles',\n]<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Configure o Diret&oacute;rio Raiz Est&aacute;tico em&nbsp;<strong>settings.py<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">STATIC_ROOT = BASE_DIR \/ 'staticfiles'<\/pre><p><strong>STATIC_ROOT<\/strong>: Caminho que define o diret&oacute;rio onde o Django dever&aacute; coletar arquivos est&aacute;ticos para deployment.<\/p><ol start=\"3\" class=\"wp-block-list\">\n<li>Execute o comando collectstatic:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;collectstatic<\/pre><p>Este comando coleta todos os arquivos est&aacute;ticos de cada diret&oacute;rio&nbsp;<strong>est&aacute;tico&nbsp;<\/strong>da aplica&ccedil;&atilde;o e de qualquer outro local especificado em&nbsp;<strong>STATICFILES_DIRS<\/strong>, armazenando-os conjuntamente no diret&oacute;rio&nbsp;<strong>STATIC_ROOT<\/strong>.<\/p><p><strong>Servindo arquivos est&aacute;ticos na produ&ccedil;&atilde;o<\/strong><\/p><p>Em um ambiente de produ&ccedil;&atilde;o, geralmente utilizamos um servidor web (como&nbsp;<strong>Nginx&nbsp;<\/strong>ou&nbsp;<strong>Apache<\/strong>) para servir arquivos est&aacute;ticos. O framework recomenda configurar o servidor para servir conte&uacute;do est&aacute;tico eficientemente, reduzindo a carga da aplica&ccedil;&atilde;o Django.<\/p><p>Confira um exemplo de como configurar a exibi&ccedil;&atilde;o de arquivos est&aacute;ticos em um ambiente Nginx:<\/p><ol class=\"wp-block-list\">\n<li>Configura&ccedil;&atilde;o do Nginx para arquivos est&aacute;ticos:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">server {\n    listen 80;\n    server_name yourdomain.com;\n    location \/static\/ {\n        alias \/path\/to\/your\/project\/staticfiles\/;  # The path to STATIC_ROOT\n    }\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:8000;  # Pass requests to Django app\n    }\n}<\/pre><p>Nesta configura&ccedil;&atilde;o, o Nginx automaticamente serve arquivos est&aacute;ticos a partir do diret&oacute;rio<strong>&nbsp;\/static\/<\/strong>, enquanto encaminha todas as outras solicita&ccedil;&otilde;es para o aplicativo Django.<\/p><p>Gerenciando corretamente seus arquivos est&aacute;ticos no Django, voc&ecirc; garante que sua aplica&ccedil;&atilde;o ter&aacute; um bom aspecto em termos de estilo e imagens, e tamb&eacute;m um funcionamento eficiente quando lan&ccedil;ada.<\/p><h2 class=\"wp-block-heading\" id=\"h-implementando-autenticacao-e-autorizacao-de-usuarios\"><strong>Implementando autentica&ccedil;&atilde;o e autoriza&ccedil;&atilde;o de usu&aacute;rios<\/strong><\/h2><p>Conforme o desenvolvimento de suas aplica&ccedil;&otilde;es se torna mais din&acirc;mico e complexo, a necessidade de gerenciar usu&aacute;rios, proteger conte&uacute;dos e controlar acessos se torna fundamental.<\/p><p>O Django conta com um sistema de autentica&ccedil;&atilde;o integrado que facilita o gerenciamento de login, logout, cadastro e permiss&otilde;es de usu&aacute;rios. Esses recursos permitem que o desenvolvedor do projeto Django gerencie eficientemente tanto a autentica&ccedil;&atilde;o quanto a autoriza&ccedil;&atilde;o de diferentes usu&aacute;rios.<\/p><h3 class=\"wp-block-heading\" id=\"h-autenticacao-de-usuarios\"><strong>Autentica&ccedil;&atilde;o de usu&aacute;rios<\/strong><\/h3><p>O sistema de autentica&ccedil;&atilde;o do Django simplifica a administra&ccedil;&atilde;o de usu&aacute;rios pelos recursos como login, logout, gerenciamento de senhas e cadastros. Por padr&atilde;o, o Django oferece a funcionalidade de modelos de usu&aacute;rio e views de autentica&ccedil;&atilde;o que lidam com a maioria dessas tarefas.<\/p><p><strong>Configurando login e logout de usu&aacute;rios<\/strong><\/p><p>Para implementar a funcionalidade de login e logout, voc&ecirc; pode usar as views integradas do framework, encontradas em&nbsp;<strong>django.contrib.auth.views.<\/strong>&nbsp;Essas views lidam com o processo de autentica&ccedil;&atilde;o e simplificam o c&oacute;digo necess&aacute;rio para processar essas opera&ccedil;&otilde;es.<\/p><ol class=\"wp-block-list\">\n<li>Configure as URLs para login e logout no arquivo&nbsp;<strong>urls.py<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom django.contrib.auth import views as auth_views\n\nurlpatterns = [\n    path('login\/', auth_views.LoginView.as_view(), name='login'),\n    path('logout\/', auth_views.LogoutView.as_view(), name='logout'),\n]<\/pre><ul class=\"wp-block-list\">\n<li><strong>LoginView<\/strong>: se refere ao login do usu&aacute;rio.<\/li>\n\n\n\n<li><strong>LogoutView<\/strong>: faz o logout e redireciona o usu&aacute;rio para a p&aacute;gina especificada.<\/li>\n<\/ul><ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Crie um template de formul&aacute;rio de login:&nbsp;<\/strong>Voc&ecirc; pode criar um modelo de login simples (<strong>login.html<\/strong>) no diret&oacute;rio de&nbsp;<strong>templates&nbsp;<\/strong>da sua aplica&ccedil;&atilde;o:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;form method=\"post\"&gt;\n    {% csrf_token %}\n    &lt;div&gt;\n        &lt;label for=\"username\"&gt;Username:&lt;\/label&gt;\n        &lt;input type=\"text\" id=\"username\" name=\"username\" required&gt;\n    &lt;\/div&gt;\n    &lt;div&gt;\n        &lt;label for=\"password\"&gt;Password:&lt;\/label&gt;\n        &lt;input type=\"password\" id=\"password\" name=\"password\" required&gt;\n    &lt;\/div&gt;\n    &lt;button type=\"submit\"&gt;Login&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><p>Este template ir&aacute; lidar com a autentica&ccedil;&atilde;o do visitante quando ele inserir um usu&aacute;rio e uma senha v&aacute;lidos.<\/p><ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Criar logout:&nbsp;<\/strong>N&atilde;o &eacute; preciso criar um template espec&iacute;fico para fazer logout, j&aacute; que o LogoutView do Django faz isso automaticamente. Voc&ecirc; pode simplesmente adicionar um link de logout no template:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;a href=\"{% url 'logout' %}\"&gt;Logout&lt;\/a&gt;<\/pre><p><strong>Criando uma View de Cadastro de Usu&aacute;rio<\/strong><\/p><p>Por padr&atilde;o, o Django n&atilde;o conta uma view de registro ou cadastro integrada, mas voc&ecirc; pode criar uma utilizando o&nbsp;<strong>UserCreationForm<\/strong>&nbsp;do Django:<\/p><ol class=\"wp-block-list\">\n<li>Crie uma view de registro no arquivo&nbsp;<strong>views.py<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.shortcuts import render, redirect\nfrom django.contrib.auth.forms import UserCreationForm\nfrom django.contrib.auth import login\n\ndef register(request):\n    if request.method == 'POST':\n        form = UserCreationForm(request.POST)\n        if form.is_valid():\n            user = form.save()\n            login(request, user)  # Automatically log the user in after registration\n            return redirect('home')  # Redirect to home page after successful registration\n    else:\n        form = UserCreationForm()\n    return render(request, 'register.html', {'form': form})<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Configure a URL para cadastro no&nbsp;<strong>urls.py<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">urlpatterns = [\n    path('register\/', views.register, name='register'),\n]<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Crie o template de formul&aacute;rio para registo (<strong>register.html<\/strong>):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;form method=\"post\"&gt;\n    {% csrf_token %}\n    {{ form.as_p }}\n    &lt;button type=\"submit\"&gt;Register&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><p>Esta view de cadastro permite que o usu&aacute;rio crie uma conta atrav&eacute;s de um formul&aacute;rio simples. Depois do registo, a sess&atilde;o do usu&aacute;rio &eacute; automaticamente iniciada.<\/p><h3 class=\"wp-block-heading\" id=\"h-autorizacao-de-usuario\"><strong>Autoriza&ccedil;&atilde;o de usu&aacute;rio&nbsp;<\/strong><\/h3><p>A autoriza&ccedil;&atilde;o de um usu&aacute;rio permite controlar o acesso dele a certas views e a&ccedil;&otilde;es com base nas permiss&otilde;es ou fun&ccedil;&otilde;es de usu&aacute;rio. O sistema de permiss&otilde;es do Django facilita o gerenciamento dos usu&aacute;rios e seus acessos a partes espec&iacute;ficas da aplica&ccedil;&atilde;o.<\/p><p><strong>Restringindo o acesso com solicita&ccedil;&atilde;o de login&nbsp;<\/strong><\/p><p>Para restringir o acesso a certas views, voc&ecirc; pode usar o decorator do Django&nbsp;<strong>@login_required<\/strong>, assim, apenas usu&aacute;rios autenticados com login podem acessar uma visualiza&ccedil;&atilde;o:<\/p><ol class=\"wp-block-list\">\n<li>Usando&nbsp;<strong>@login_required<\/strong>&nbsp;em views:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.contrib.auth.decorators import login_required\n\n@login_required\ndef dashboard(request):\n    return render(request, 'dashboard.html')<\/pre><p>Isso garante que se um usu&aacute;rio n&atilde;o estiver logado, ele ser&aacute; automaticamente redirecionado para a p&aacute;gina de login.<\/p><ol start=\"2\" class=\"wp-block-list\">\n<li>Aplicando o&nbsp;<strong>@login_required<\/strong>&nbsp;em URLs espec&iacute;ficas: Alternativamente, voc&ecirc; pode usar o&nbsp;<strong>@login_required&nbsp;<\/strong>diretamente no arquivo&nbsp;<strong>urls.py&nbsp;<\/strong>atrav&eacute;s do&nbsp;<strong>LoginRequiredMixin&nbsp;<\/strong>para views baseadas em classe (CBVs):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.contrib.auth.mixins import LoginRequiredMixin\nfrom django.views.generic import TemplateView\n\nclass DashboardView(LoginRequiredMixin, TemplateView):\n    template_name = 'dashboard.html'<\/pre><p><strong>Gerenciamento de permiss&otilde;es de usu&aacute;rio<\/strong><\/p><p>O Django permite que voc&ecirc; atribua diferentes permiss&otilde;es a usu&aacute;rios e grupos de usu&aacute;rios, que podem ser usadas para controlar o acesso a visualiza&ccedil;&otilde;es ou a&ccedil;&otilde;es espec&iacute;ficas. As permiss&otilde;es podem ser adicionadas aos modelos de usu&aacute;rio e gerenciadas nas views.<\/p><ol class=\"wp-block-list\">\n<li><strong>Atribui&ccedil;&atilde;o de permiss&otilde;es:&nbsp;<\/strong>Ao criar usu&aacute;rios ou grupos de usu&aacute;rios, &eacute; poss&iacute;vel atribuir permiss&otilde;es a eles. Por exemplo, um usu&aacute;rio administrador pode ter permiss&atilde;o para adicionar ou excluir conte&uacute;dos, enquanto os usu&aacute;rios comuns s&oacute; podem visualizar o conte&uacute;do.<\/li>\n\n\n\n<li><strong>Verifica&ccedil;&atilde;o de permiss&otilde;es em views:<\/strong>&nbsp;Voc&ecirc; pode verificar se um usu&aacute;rio tem as permiss&otilde;es necess&aacute;rias antes de permitir o acesso a determinadas views usando o decorator&nbsp;<strong>@permission_required<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.contrib.auth.decorators import permission_required\n\n@permission_required('app.add_article')\ndef add_article(request):\n    # View code for adding an article<\/pre><p>Nesse caso, somente os usu&aacute;rios com a permiss&atilde;o add_article poder&atilde;o acessar a visualiza&ccedil;&atilde;o indicada.<\/p><p><strong>Restringir o acesso com base nas fun&ccedil;&otilde;es do usu&aacute;rio<\/strong><\/p><p>O recurso de&nbsp;<strong>grupos&nbsp;<\/strong>do Django permite que voc&ecirc; crie fun&ccedil;&otilde;es (como &ldquo;<strong>editor<\/strong>&rdquo; ou &ldquo;<strong>visualizador<\/strong>&rdquo;) e atribua usu&aacute;rios a esses grupos. A partir disso, voc&ecirc; pode gerenciar a participa&ccedil;&atilde;o de um usu&aacute;rio a um grupo espec&iacute;fico para controlar o acesso.<\/p><ol class=\"wp-block-list\">\n<li><strong>Atribuindo usu&aacute;rios aos grupos:<\/strong>&nbsp;Os grupos podem ser criados no painel de administra&ccedil;&atilde;o do Django ou de forma program&aacute;tica:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.contrib.auth.models import Group, User\n\ngroup = Group.objects.get(name='editors')\nuser = User.objects.get(username='john')\nuser.groups.add(group)  # Assign the user to the 'editors' group<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Configurando o acesso dos grupos nas views:&nbsp;<\/strong>Voc&ecirc; pode restringir as visualiza&ccedil;&otilde;es com base no grupo:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.contrib.auth.decorators import user_passes_test\n\ndef is_editor(user):\n    return user.groups.filter(name='editors').exists()\n\n@user_passes_test(is_editor)\ndef editor_dashboard(request):\n    return render(request, 'editor_dashboard.html')<\/pre><p>Neste exemplo, somente os usu&aacute;rios que pertencem ao grupo &ldquo;editores&rdquo; podem acessar a visualiza&ccedil;&atilde;o do painel de edi&ccedil;&atilde;o, o&nbsp;<strong>editor_dashboard<\/strong>.<\/p><p>Utilizando os sistemas integrados de autentica&ccedil;&atilde;o e autoriza&ccedil;&atilde;o do Django, voc&ecirc; pode gerenciar o login, o cadastro e as permiss&otilde;es dos usu&aacute;rios com seguran&ccedil;a, garantindo que conte&uacute;dos sens&iacute;veis estar&atilde;o protegidos e que o acesso ser&aacute; liberado ou limitado de acordo com o caso.<\/p><h2 class=\"wp-block-heading\" id=\"h-trabalhando-com-formularios-no-django\"><strong>Trabalhando com formul&aacute;rios no Django<\/strong><\/h2><p>Depois de implementar os servi&ccedil;os de autentica&ccedil;&atilde;o e autoriza&ccedil;&atilde;o de usu&aacute;rios, o pr&oacute;ximo recurso a ser gerenciado em uma p&aacute;gina web s&atilde;o os inputs dos usu&aacute;rios pelos formul&aacute;rios. O Django conta com um sistema potente e flex&iacute;vel para criar, processar e validar formul&aacute;rios.<\/p><p>O sistema de formul&aacute;rios do Django &eacute; baseado em classes Python que tratam formul&aacute;rios como objetos. Esses formul&aacute;rios podem ser renderizados em templates, validados e processados atrav&eacute;s de algumas poucas linhas de c&oacute;digo. Os formul&aacute;rios podem ser criados manualmente com a classe&nbsp;<strong>Form&nbsp;<\/strong>do Django ou gerados automaticamente a partir de modelos do<strong>&nbsp;ModelForm<\/strong>.<\/p><h3 class=\"wp-block-heading\" id=\"h-criando-formularios-com-a-classe-form-do-django\"><strong>Criando Formul&aacute;rios com a Classe &ldquo;Form&rdquo; do Django<\/strong><\/h3><p>Para criar um formul&aacute;rio usando o framework Django, &eacute; preciso primeiro definir uma classe de formul&aacute;rio no arquivo <strong>forms.py<\/strong>. Essa classe define os campos e as regras de preenchimento e valida&ccedil;&atilde;o do formul&aacute;rio.<\/p><ol class=\"wp-block-list\">\n<li><strong>Definindo um formul&aacute;rio:&nbsp;<\/strong>este &eacute; um exemplo de formul&aacute;rio de contato simples:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># forms.py\nfrom django import forms\nclass ContactForm(forms.Form):\n    name = forms.CharField(max_length=100, label='Seu Nome')\n    email = forms.EmailField(label='Seu Email')\n    message = forms.CharField(widget=forms.Textarea, label='Sua Mensagem')<\/pre><p>Esse formul&aacute;rio inclui tr&ecirc;s campos: nome, email e mensagem. Cada campo &eacute; representado por uma classe de campo de preenchimento, como&nbsp;<strong>CharField&nbsp;<\/strong>para texto curto,&nbsp;<strong>EmailField<\/strong>&nbsp;para endere&ccedil;os de email e&nbsp;<strong>Textarea<\/strong>&nbsp;para entradas de texto mais longas.<\/p><ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Renderizando o formul&aacute;rio em um template:&nbsp;<\/strong>Para exibir o formul&aacute;rio na p&aacute;gina de contato, &eacute; necess&aacute;rio fazer a renderiza&ccedil;&atilde;o dele dentro de um template. Voc&ecirc; pode renderizar o formul&aacute;rio manualmente ou utilizar os recursos de renderiza&ccedil;&atilde;o de formul&aacute;rio integrados ao Django:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;form method=\"post\"&gt;\n    {% csrf_token %}\n    {{ form.as_p }}\n    &lt;button type=\"submit\"&gt;Enviar Mensagem&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><ul class=\"wp-block-list\">\n<li><strong>{% csrf_token %}<\/strong>: Adiciona um token CSRF para proteger contra ataques de falsifica&ccedil;&atilde;o de solicita&ccedil;&otilde;es entre sites (Cross-Site Request Forgery).<\/li>\n\n\n\n<li><strong>{{&nbsp;form.as_p }}<\/strong>: Renderiza os campos do formul&aacute;rio com cada campo correspondendo a uma tag<strong>&nbsp;&lt;p&gt;<\/strong>&nbsp;para facilitar a personaliza&ccedil;&atilde;o.<\/li>\n<\/ul><ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Lidando com envios de formul&aacute;rios:&nbsp;<\/strong>Na exibi&ccedil;&atilde;o que lida com o envio do formul&aacute;rio, voc&ecirc; precisa validar e processar os dados do formul&aacute;rio, caso ele seja v&aacute;lido:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># views.py\nfrom django.shortcuts import render\nfrom .forms import ContactForm\n\ndef contact_view(request):\n    if request.method == 'POST':\n        form = ContactForm(request.POST)\n        if form.is_valid():\n            # Process the data, e.g., send an email or save it to the database\n            name = form.cleaned_data['name']\n            email = form.cleaned_data['email']\n            message = form.cleaned_data['message']\n            # Redirect to a success page or show a success message\n            return render(request, 'thanks.html')\n    else:\n        form = ContactForm()\n    return render(request, 'contact.html', {'form': form})<\/pre><p>Nesta view:<\/p><ul class=\"wp-block-list\">\n<li>Se o formul&aacute;rio for enviado por meio de uma solicita&ccedil;&atilde;o POST, os dados do formul&aacute;rio ser&atilde;o validados.<\/li>\n\n\n\n<li><strong>form.is_valid()<\/strong>: A fun&ccedil;&atilde;o verifica se os dados do formul&aacute;rio foram aprovados na etapa de valida&ccedil;&atilde;o.<\/li>\n\n\n\n<li><strong>form.cleaned_data<\/strong>: Cont&eacute;m os dados de formul&aacute;rio que foram validados e que agora podem ser processados (por exemplo, enviando um email).<\/li>\n\n\n\n<li>Se a solicita&ccedil;&atilde;o n&atilde;o for do tipo&nbsp;<strong>POST<\/strong>, um formul&aacute;rio vazio ser&aacute; exibido para o usu&aacute;rio preencher.<\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-validacao-de-formularios-e-correcao-de-erros\"><strong>Valida&ccedil;&atilde;o de formul&aacute;rios e corre&ccedil;&atilde;o de erros<\/strong><\/h3><p>Os formul&aacute;rios do Django contam com um sistema de valida&ccedil;&atilde;o integrado que garante que os dados enviados estejam corretos e seguros. A valida&ccedil;&atilde;o de campos como<strong>&nbsp;EmailField<\/strong>&nbsp;indica se o usu&aacute;rio preencheu um endere&ccedil;o de email v&aacute;lido. Voc&ecirc; tamb&eacute;m pode criar uma l&oacute;gica de valida&ccedil;&atilde;o personalizada para aplicar regras espec&iacute;ficas aos formul&aacute;rios.<\/p><p><strong>Valida&ccedil;&atilde;o padr&atilde;o<\/strong><\/p><p>O Django executa automaticamente algumas valida&ccedil;&otilde;es:<\/p><ul class=\"wp-block-list\">\n<li><strong>Campos obrigat&oacute;rios:<\/strong>&nbsp;Por padr&atilde;o, todos os campos s&atilde;o obrigat&oacute;rios, a menos que voc&ecirc; especifique required=False.<\/li>\n\n\n\n<li><strong>Tipos de campo de preenchimento:&nbsp;<\/strong>Campos como&nbsp;<strong>EmailField<\/strong>,&nbsp;<strong>IntegerField<\/strong>&nbsp;e&nbsp;<strong>URLField<\/strong>&nbsp;validam automaticamente o tipo de dados inseridos.<\/li>\n<\/ul><p><strong>Valida&ccedil;&atilde;o personalizada<\/strong><\/p><p>Voc&ecirc; tamb&eacute;m pode definir uma l&oacute;gica de valida&ccedil;&atilde;o personalizada para seus formul&aacute;rios, basta sobrescrever o m&eacute;todo&nbsp;<strong>clean()&nbsp;<\/strong>ou criar validadores de campo personalizados.<\/p><ol class=\"wp-block-list\">\n<li>Adicionando um validador personalizado para o campo de nome (name):<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># forms.py\nfrom django import forms\nfrom django.core.exceptions import ValidationError\nclass ContactForm(forms.Form):\n    name = forms.CharField(max_length=100, label='Seu Nome')\n    email = forms.EmailField(label='Seu Email')\n    message = forms.CharField(widget=forms.Textarea, label='Sua Mensagem')\n    def clean_name(self):\n        name = self.cleaned_data.get('name')\n        if \"spam\" in name.lower():\n            raise ValidationError(\"Invalid name: 'spam' is not allowed.\")\n        return name<\/pre><p>Nesse exemplo, se o nome contiver a palavra&nbsp;<strong>spam<\/strong>, o Django ir&aacute; retornar um erro de valida&ccedil;&atilde;o.<\/p><ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Corrigindo erros de formul&aacute;rio:&nbsp;<\/strong>Voc&ecirc; pode personalizar como os erros de formul&aacute;rio s&atilde;o exibidos nos templates. O Django adiciona mensagens de erro em cada campo preenchido incorretamente e voc&ecirc; pode exibir as mensagens desta forma:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;form method=\"post\"&gt;\n    {% csrf_token %}\n    &lt;div&gt;\n        {{ form.name.label_tag }} {{ form.name }}\n        {% if form.name.errors %}\n            &lt;div class=\"error\"&gt;{{ form.name.errors }}&lt;\/div&gt;\n        {% endif %}\n    &lt;\/div&gt;\n    &lt;div&gt;\n        {{ form.email.label_tag }} {{ form.email }}\n        {% if form.email.errors %}\n            &lt;div class=\"error\"&gt;{{ form.email.errors }}&lt;\/div&gt;\n        {% endif %}\n    &lt;\/div&gt;\n    &lt;div&gt;\n        {{ form.message.label_tag }} {{ form.message }}\n        {% if form.message.errors %}\n            &lt;div class=\"error\"&gt;{{ form.message.errors }}&lt;\/div&gt;\n        {% endif %}\n    &lt;\/div&gt;\n    &lt;button type=\"submit\"&gt;Send Message&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><p>Isso faz com que a p&aacute;gina exiba mensagens de erro ao lado dos campos de preenchimento que os usu&aacute;rios precisam corrigir.<\/p><h3 class=\"wp-block-heading\" id=\"h-criando-formularios-a-partir-de-modelos-usando-o-modelform\"><strong>Criando Formul&aacute;rios a partir de Modelos Usando o ModelForm<\/strong><\/h3><p>Em muitos casos, os formul&aacute;rios est&atilde;o vinculados a modelos. Com o Django, &eacute; f&aacute;cil criar formul&aacute;rios a partir de modelos usando o&nbsp;<strong>ModelForm<\/strong>. Essa t&eacute;cnica economiza seu tempo pois automaticamente gera os campos do formul&aacute;rio de acordo com os campos do modelo.<\/p><ol class=\"wp-block-list\">\n<li><strong>Criando um ModelForm:&nbsp;<\/strong>Neste exemplo, voc&ecirc; tem um modelo&nbsp;<strong>Post&nbsp;<\/strong>no arquivo&nbsp;<strong>models.py<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># models.py\nfrom django.db import models\n\nclass Post(models.Model):\n    title = models.CharField(max_length=200)\n    content = models.TextField()\n    created_at = models.DateTimeField(auto_now_add=True)<\/pre><p>Voc&ecirc; pode criar um formul&aacute;rio para esse modelo assim:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># forms.py\nfrom django import forms\nfrom .models import Post\n\nclass PostForm(forms.ModelForm):\n    class Meta:\n        model = Post\n        fields = ['title', 'content']<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Usando o&nbsp;<strong>ModelForm<\/strong>&nbsp;em uma view:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># views.py\nfrom django.shortcuts import render\nfrom .forms import PostForm\n\ndef create_post(request):\n    if request.method == 'POST':\n        form = PostForm(request.POST)\n        if form.is_valid():\n            form.save()  # Saves the form data to the database\n            return redirect('post_list')  # Redirect to a list of posts\n    else:\n        form = PostForm()\n    return render(request, 'create_post.html', {'form': form})<\/pre><p>Ao usar o&nbsp;<strong>ModelForm<\/strong>, o Django gera campos de formul&aacute;rio automaticamente com base nos campos do modelo Post e salva o formul&aacute;rio no banco de dados.<\/p><h2 class=\"wp-block-heading\" id=\"h-fazendo-o-deployment-de-uma-aplicacao-django\"><strong>Fazendo o Deployment de uma Aplica&ccedil;&atilde;o Django<\/strong><\/h2><p>Depois que o projeto estiver totalmente desenvolvido e testado no seu servidor local, a etapa final &eacute; fazer o lan&ccedil;amento da aplica&ccedil;&atilde;o em um servidor live para que os usu&aacute;rios possam acessar. O deploy, ou implanta&ccedil;&atilde;o, de um projeto Django exige cuidado e aten&ccedil;&atilde;o &agrave;s pr&aacute;ticas recomendadas para garantir a seguran&ccedil;a, a escalabilidade e o desempenho do projeto. Nesta se&ccedil;&atilde;o, vamos apresentar as etapas b&aacute;sicas de publica&ccedil;&atilde;o do seu app em uma VPS.<\/p><h3 class=\"wp-block-heading\" id=\"h-praticas-pecomendadas-para-o-deployment-de-um-projeto-django\"><strong>Pr&aacute;ticas pecomendadas para o deployment de um projeto Django<\/strong><\/h3><p>Antes de come&ccedil;ar com as etapas t&eacute;cnicas, &eacute; importante seguir algumas boas pr&aacute;ticas para preparar seu projeto Django:<\/p><ol class=\"wp-block-list\">\n<li><strong>Use vari&aacute;veis de ambiente:&nbsp;<\/strong>As environment variables servem para armazenar informa&ccedil;&otilde;es confidenciais, como senhas, credenciais de banco de dados e chaves de API &ndash; assim voc&ecirc; n&atilde;o precisa codificar esses dados nas suas configura&ccedil;&otilde;es.<\/li>\n\n\n\n<li><strong>Desabilite o modo de depura&ccedil;&atilde;o:&nbsp;<\/strong>Defina<strong>&nbsp;DEBUG = False&nbsp;<\/strong>em seu arquivo<strong>&nbsp;settings.py&nbsp;<\/strong>antes de fazer o deploy do seu projeto. O modo debug pode vazar informa&ccedil;&otilde;es confidenciais a invasores.<\/li>\n\n\n\n<li><strong>Defina os hosts permitidos:<\/strong>&nbsp;No arquivo&nbsp;<strong>settings.py<\/strong>, defina o par&acirc;metro&nbsp;<strong>ALLOWED_HOSTS<\/strong>&nbsp;para incluir o(s) nome(s) de dom&iacute;nio em que a aplica&ccedil;&atilde;o estar&aacute; hospedada. Por exemplo:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ALLOWED_HOSTS = ['seudominio.com', 'www.seudominio.com']<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Proteja a aplica&ccedil;&atilde;o:&nbsp;<\/strong>Considere usar o protocolo HTTPS para transferir dados entre o servidor e os usu&aacute;rios de forma segura, e use as configura&ccedil;&otilde;es de seguran&ccedil;a integradas do Django, como&nbsp;<strong>SECURE_SSL_REDIRECT<\/strong>,&nbsp;<strong>CSRF_COOKIE_SECURE<\/strong>, e&nbsp;<strong>SESSION_COOKIE_SECURE<\/strong>.<\/li>\n\n\n\n<li><strong>Verifique os arquivos est&aacute;ticos:&nbsp;<\/strong>Arquivos est&aacute;ticos, como CSS e JavaScript, devem ser coletados e servidos da forma correta. O Django fornece o comando&nbsp;<strong>collectstatic&nbsp;<\/strong>para lidar com esses arquivos.<\/li>\n\n\n\n<li><strong>Configura&ccedil;&atilde;o do banco de dados:&nbsp;<\/strong>Seu banco de dados deve estar configurado corretamente, lembrando de evitar o uso do SQLite para produ&ccedil;&atilde;o &ndash; nesse caso, opte por um banco de dados mais robusto, como PostgreSQL ou MySQL.<\/li>\n<\/ol><h3 class=\"wp-block-heading\" id=\"h-deploy-do-django-em-uma-vps\"><strong>Deploy do Django em uma VPS<\/strong><\/h3><p>Agora que voc&ecirc; j&aacute; conhece as boas pr&aacute;ticas para preparar o lan&ccedil;amento do seu projeto Django, &eacute; hora de implant&aacute;-lo em um servidor virtual privado (VPS). Nesta se&ccedil;&atilde;o, vamos indicar as etapas de configura&ccedil;&atilde;o do servidor e dos servi&ccedil;os necess&aacute;rios para colocar seu aplicativo Django no ar e torn&aacute;-lo acess&iacute;vel aos usu&aacute;rios.<\/p><p><strong>Criando um arquivo Python requirements.txt<\/strong><\/p><p>O arquivo&nbsp;<strong>requirements.txt<\/strong>&nbsp;lista todas as depend&ecirc;ncias Python necess&aacute;rias para rodar seu projeto Django. Esse arquivo permite que voc&ecirc; instale todos os pacotes necess&aacute;rios com um &uacute;nico comando.<\/p><p>Lembre-se de ativar o ambiente virtual e acessar o diret&oacute;rio principal do seu projeto, onde est&aacute; o arquivo<strong>&nbsp;manage.py<\/strong>.<\/p><p>Em seguida, crie o arquivo<strong>&nbsp;requirements.txt<\/strong>&nbsp;com o seguinte comando:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip3 freeze &gt; requirements.txt<\/pre><p>Esse comando cria um arquivo<strong>&nbsp;requirements.txt&nbsp;<\/strong>no diret&oacute;rio atual j&aacute; com todos os pacotes e vers&otilde;es que est&atilde;o instalados em seu ambiente virtual.<\/p><p>Depois disso, abra o arquivo&nbsp;<strong>requirements.txt&nbsp;<\/strong>e verifique se todas as depend&ecirc;ncias Python necess&aacute;rias para executar seu projeto est&atilde;o listadas.<\/p><p><strong>Fazendo o upload do projeto num reposit&oacute;rio remoto (GitHub)<\/strong><\/p><p>Antes de fazer o deploy do seu projeto na VPS, uma pr&aacute;tica muito recomendada &eacute; fazer o upload do seu c&oacute;digo em um reposit&oacute;rio remoto, como o GitHub. Isso permite que voc&ecirc; controle as vers&otilde;es da aplica&ccedil;&atilde;o, facilite o trabalho entre colaboradores do projeto e simplifique o pr&oacute;prio processo de deployment.<\/p><ol class=\"wp-block-list\">\n<li>Instale a interface (CLI) do Git e crie um reposit&oacute;rio local. Verifique se voc&ecirc; est&aacute; na pasta principal do projeto, onde est&aacute; o arquivo<strong>&nbsp;manage.py<\/strong>, e execute estes comandos:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install git-all<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git init<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Crie um arquivo&nbsp;<strong>.gitignore<\/strong>&nbsp;e adicione o conte&uacute;do a ele. O&nbsp;<a href=\"https:\/\/docs.github.com\/en\/get-started\/getting-started-with-git\/ignoring-files\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>arquivo .gitignore<\/strong><\/a>&nbsp;informa ao Git quais arquivos devem ser ignorados ao enviar o c&oacute;digo para o reposit&oacute;rio remoto. Isso &eacute; feito para evitar que arquivos com informa&ccedil;&otilde;es confidenciais e arquivos locais irrelevantes, como logs, sejam publicados. Aqui est&aacute; um exemplo de arquivo&nbsp;<strong>.gitignore<\/strong>&nbsp;para um projeto Django:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">venv\/\n__pycache__\/\ndb.sqlite3\n*.pyc\n*.log\nmedia\/<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Lembre-se de limpar as informa&ccedil;&otilde;es confidenciais no arquivo&nbsp;<strong>settings.py<\/strong>, como senhas e nomes de usu&aacute;rio. Depois que o projeto for lan&ccedil;ado, voc&ecirc; poder&aacute; adicionar as credenciais &agrave; VPS.<\/li>\n\n\n\n<li>Adicione e confirme (Commit) seus arquivos.<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git add .<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git commit -m \"Initial commit\"<\/pre><ol start=\"5\" class=\"wp-block-list\">\n<li>Fa&ccedil;a seu cadastro e login no&nbsp;<a href=\"https:\/\/github.com\/signup\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>GitHub<\/strong><\/a>&nbsp;e crie um novo reposit&oacute;rio remoto, defina o status como privado e copie seu link.<\/li>\n\n\n\n<li>Configure a origem (origin) e o ramo (branch) do reposit&oacute;rio Git.<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git remote add origin&nbsp;https:\/\/github.com\/url-do-repositorio-criado<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git branch -M main<\/pre><ol start=\"7\" class=\"wp-block-list\">\n<li>Verifique o status do seu reposit&oacute;rio local e fa&ccedil;a o push dos arquivos. Antes de fazer esse envio, voc&ecirc; deve executar o comando&nbsp;<strong>status&nbsp;<\/strong>para garantir que os arquivos que n&atilde;o devem ser publicados n&atilde;o tenham sido adicionados ao reposit&oacute;rio:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git status<\/pre><ol start=\"8\" class=\"wp-block-list\">\n<li>Confirme que apenas os arquivos que voc&ecirc; deseja publicar foram adicionados e fa&ccedil;a o push deles para o reposit&oacute;rio remoto:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git push -u origin main<\/pre><ol start=\"9\" class=\"wp-block-list\">\n<li>Acesse seu reposit&oacute;rio remoto no GitHub e verifique os arquivos enviados.<\/li>\n<\/ol><p><strong>Prepare sua VPS e recupere (retrieve) o c&oacute;digo do projeto<\/strong><\/p><p>O pr&oacute;ximo passo &eacute; preparar seu servidor virtual para o deployment e fazer o download do c&oacute;digo da aplica&ccedil;&atilde;o nele:<\/p><ol class=\"wp-block-list\">\n<li>Acesse seu VPS via SSH<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh root@ip_do_seu_vps<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Instale o <strong>Nginx<\/strong> e o <strong>Gunicorn<\/strong><\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install nginx<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo pip3 install gunicorn<\/pre><p>Usaremos o&nbsp;<strong>Nginx&nbsp;<\/strong>como servidor web e o&nbsp;<strong>Gunicorn&nbsp;<\/strong>como servidor da aplica&ccedil;&atilde;o.<\/p><ol start=\"3\" class=\"wp-block-list\">\n<li>Recupere o c&oacute;digo a partir do GitHub<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git clone&nbsp;https:\/\/github.com\/seu-repositorio\/nome-do-projeto.git<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd nome-do-projeto<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Inicie um ambiente virtual e instale as depend&ecirc;ncias necess&aacute;rias<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 -m venv env_namesource env_name\/bin\/activate<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip3 install -r requirements.txt<\/pre><ol start=\"5\" class=\"wp-block-list\">\n<li>Insira os dados sens&iacute;veis de volta no arquivo&nbsp;<strong>settings.py<\/strong><\/li>\n\n\n\n<li>Rode as migra&ccedil;&otilde;es (migrations) e colete os arquivos est&aacute;ticos<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;migrate<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python&nbsp;manage.py&nbsp;collectstatic<\/pre><ol start=\"7\" class=\"wp-block-list\">\n<li>Configure o Gunicorn como o servidor de aplica&ccedil;&atilde;o. Crie um arquivo de servi&ccedil;os:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo nano \/etc\/systemd\/system\/gunicorn.service<\/pre><p>Adicione a seguinte configura&ccedil;&atilde;o:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[Unit]\nDescription=gunicorn daemon\nAfter=network.target\n\n[Service]\nUser=your-username\nGroup=www-data\nWorkingDirectory=\/your\/project\/directory\nExecStart=\/your\/project\/directory\/env_name\/bin\/gunicorn --access-logfile - --workers 3 --bind unix:\/your\/project\/directory.sock myproject.wsgi:application\n\n[Install]\nWantedBy=multi-user.target<\/pre><p>Lembre-se de substituir os campos de&nbsp;<strong>your-username<\/strong>&nbsp;e&nbsp;<strong>\/your\/project\/directory&nbsp;<\/strong>com os valores reais do seu nome de usu&aacute;rio e do caminho do diret&oacute;rio do seu projeto.<\/p><ol start=\"8\" class=\"wp-block-list\">\n<li>Inicie e habilite o Gunicorn<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo systemctl start gunicorn<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo systemctl enable gunicorn<\/pre><ol start=\"9\" class=\"wp-block-list\">\n<li>Configure o Nginx como servidor web. Crie um arquivo de configura&ccedil;&atilde;o:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo nano \/etc\/nginx\/sites-available\/myproject<\/pre><p>Adicione a seguinte configura&ccedil;&atilde;o:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">server {\n    listen 80;\n    server_name yourdomain.com www.yourdomain.com;\n\n    location \/ {\n        proxy_pass http:\/\/unix:\/your\/project\/directory\/project-name.sock;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n\n    location \/static\/ {\n        alias \/your\/project\/directory\/static\/;\n    }\n\n    location \/media\/ {\n        alias \/your\/project\/directory\/media\/;\n    }\n}<\/pre><p>Lembre-se de substituir o campo&nbsp;<strong>\/your\/project\/directory&nbsp;<\/strong>com o caminho real do diret&oacute;rio do seu projeto.<\/p><ol start=\"10\" class=\"wp-block-list\">\n<li>Habilite o site e reinicie o Nginx<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo ln -s \/etc\/nginx\/sites-available\/myproject \/etc\/nginx\/sites-enabled<\/pre><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo systemctl restart nginx<\/pre><ol start=\"11\" class=\"wp-block-list\">\n<li>Proteja o servidor com SSL: usaremos o Certbot para adicionar um certificado SSL e redirecionar o tr&aacute;fego de HTTP para HTTPS:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install certbot python3-certbot-nginxsudo certbot --nginx -d yourdomain.com -d www.yourdomain.com<\/pre><p>Seguindo esses passos, voc&ecirc; pode lan&ccedil;ar seu projeto Django em uma VPS sem maiores erros, garantindo a seguran&ccedil;a da aplica&ccedil;&atilde;o e um bom desempenho.<\/p><p>Com o Nginx e o Gunicorn cuidando da transfer&ecirc;ncia de dados entre a web e o servidor, sua aplica&ccedil;&atilde;o est&aacute; pronta para lidar com tr&aacute;fego ativo. Visite seu dom&iacute;nio e, se tiver configurado tudo corretamente, voc&ecirc; ver&aacute; sua aplica&ccedil;&atilde;o ativa.<\/p><h2 class=\"wp-block-heading\" id=\"h-conclusao\"><strong>Conclus&atilde;o<\/strong><\/h2><p>Neste tutorial Django, apresentamos as etapas essenciais para come&ccedil;ar a usar o framework, desde a configura&ccedil;&atilde;o do ambiente de desenvolvimento at&eacute; o deployment do projeto em um servidor virtual privado (VPS). O passo-a-passo mostrou como criar um projeto, gerenciar modelos, armazenar dados, criar views e templates, trabalhar com URLs e com arquivos est&aacute;ticos, implementar autentica&ccedil;&atilde;o de usu&aacute;rio e publicar sua aplica&ccedil;&atilde;o em um servidor ativo.<\/p><p>Com esses conhecimentos b&aacute;sicos, agora voc&ecirc; estar&aacute; preparado para come&ccedil;ar a criar seus pr&oacute;prios projetos com o framework Django. Seja um simples blog ou um aplicativo mais complexo, o Django fornece as ferramentas necess&aacute;rias para dar vida &agrave;s suas ideias. Mergulhe de cabe&ccedil;a, experimente e veja o que &eacute; poss&iacute;vel criar com esse poderoso framework.<\/p><h2 class=\"wp-block-heading\" id=\"h-perguntas-frequentes-sobre-django\"><strong>Perguntas frequentes sobre Django<\/strong><\/h2><div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-69441068908a0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">O que &eacute; Django?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Django &eacute; um framework, ou estrutura, Python e de alto n&iacute;vel. Foi projetado para atividades de desenvolvimento web r&aacute;pido e de design simples e pragm&aacute;tico. Ele simplifica o processo de cria&ccedil;&atilde;o de aplica&ccedil;&otilde;es para a internet, fornecendo componentes reutiliz&aacute;veis, como autentica&ccedil;&atilde;o de usu&aacute;rios, ORM e roteamento de URL, ao mesmo tempo em que promove a seguran&ccedil;a e a pr&aacute;tica de princ&iacute;pios recomendados, como DRY (Don&rsquo;t Repeat Yourself).<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-69441068908a3\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Por que usar o Django?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>O Django &eacute; popular por sua velocidade, seguran&ccedil;a e capacidade de expans&atilde;o. Ele simplifica o desenvolvimento web com recursos j&aacute; integrados, como autentica&ccedil;&atilde;o de usu&aacute;rios, ORM para gerenciamento de banco de dados e roteamento de URL. Sua filosofia de &ldquo;baterias inclu&iacute;das&rdquo; (batteries-included) indica que os desenvolvedores que utilizam o framework Django s&atilde;o capazes de criar aplicativos robustos de forma eficiente.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-69441068908a4\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Preciso saber Python para usar o Django?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Sim, conhecer a linguagem de programa&ccedil;&atilde;o Python &eacute; essencial para aprender a usar o Django, j&aacute; que esse framework &eacute; baseado em Python. A familiaridade com a sintaxe, a programa&ccedil;&atilde;o orientada a objetos e a estrutura de dados do Python facilita o entendimento sobre a estrutura e as funcionalidades do Django, tornando o processo de aprendizado mais simples e eficiente.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>O Django &eacute; um framework Python de alto n&iacute;vel usado para atividades de desenvolvimento r&aacute;pido e de design simples e pragm&aacute;tico. Ele simplifica muitas tarefas de desenvolvimento web, permitindo que voc&ecirc; se concentre em desenvolver sua aplica&ccedil;&atilde;o sem precisar reinventar a roda. Isso faz do Django um dos frameworks mais populares e amplamente utilizados para [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/pt\/tutoriais\/tutorial-django\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":356,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"","rank_math_description":"No nosso tutorial Django, voc\u00ea aprender\u00e1 a criar sua primeira aplica\u00e7\u00e3o de forma simples e r\u00e1pida. Comece a desenvolver hoje mesmo!","rank_math_focus_keyword":"tutorial Django","footnotes":""},"categories":[4915],"tags":[],"class_list":["post-48865","post","type-post","status-publish","format-standard","hentry","category-vps"],"hreflangs":[{"locale":"en-US","link":"https:\/\/www.hostinger.com\/tutorials\/django-tutorial","default":0},{"locale":"pt-BR","link":"https:\/\/www.hostinger.com\/br\/tutoriais\/tutorial-django","default":0},{"locale":"fr-FR","link":"https:\/\/www.hostinger.com\/fr\/tutoriels\/tutoriel-django","default":0},{"locale":"en-UK","link":"https:\/\/www.hostinger.com\/uk\/tutorials\/django-tutorial","default":0},{"locale":"en-MY","link":"https:\/\/www.hostinger.com\/my\/tutorials\/coolify-vs-dokploy-10","default":0},{"locale":"en-PH","link":"https:\/\/www.hostinger.com\/ph\/tutorials\/django-tutorial","default":0},{"locale":"en-IN","link":"https:\/\/www.hostinger.com\/in\/tutorials\/django-tutorial","default":0},{"locale":"en-CA","link":"https:\/\/www.hostinger.com\/ca\/tutorials\/django-tutorial","default":0},{"locale":"pt-PT","link":"https:\/\/www.hostinger.com\/pt\/tutoriais\/tutorial-django","default":0},{"locale":"en-AU","link":"https:\/\/www.hostinger.com\/au\/tutorials\/django-tutorial","default":0},{"locale":"en-NG","link":"https:\/\/www.hostinger.com\/ng\/tutorials\/django-tutorial","default":0}],"acf":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts\/48865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/users\/356"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/comments?post=48865"}],"version-history":[{"count":1,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts\/48865\/revisions"}],"predecessor-version":[{"id":49005,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts\/48865\/revisions\/49005"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/media?parent=48865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/categories?post=48865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/tags?post=48865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}