Django: Explorando o Framework com um Exemplo Prático - Parte 1
Tags: beginners, django, webdev, python
Published: 2023-12-22 12:22:03

Já faz ~~MUITO~~ tempo, que tenho vontade de compartilhar experiências e aprendizados através conteúdo escrito. Este é o meu primeiro _post_ e espero que goste!

Trarei uma série de postagens educacionais onde explorarei funcionalidades do **Django**. Se tiverem sugestões e/ou dúvidas, estou 100% à disposição para conversarmos.

---

## O que é o **Django**?

Sem entrar em muitos detalhes e irmos direto a prática, a autodefinição traduzida pela própria [documentação](https://www.djangoproject.com/) diz o seguinte:

> **Django** é um framework web em Python de alto nível que incentiva o desenvolvimento rápido e um design limpo e pragmático. Desenvolvido por programadores experientes, ele lida com grande parte das complexidades do desenvolvimento web, permitindo que você se concentre na escrita de sua aplicação sem precisar reinventar a roda. É gratuito e de código aberto.

E, para tentar te convencer sobre sua importância, você pode checar a [listagem de frameworks web Python mais utilizados em 2022.](https://lp.jetbrains.com/python-developers-survey-2022/#FrameworksLibraries)

---

## Quais os objetivos deste _post_?

- Mostrar como podemos iniciar um projeto com o framework.
- Compreender a estrutura inicial de um projeto **Django**.

---

## Introdução 

Vamos começar com um projeto que pretende ser um sistema de agendamentos, algo similar à uma agenda, mas que posteriormente adicionaremos controle de pagamentos e outras funcionalidades. 

Entretanto, para alinhamento de expectativas, no final desta postagem ainda não teremos feito nada do que foi proposto, apenas preparado o projeto para o desenvolvimento.

Antes de mais nada, crie a pasta onde vai colocar o projeto e já inicie o [ambiente virtual (venv).](https://docs.python.org/3/library/venv.html#creating-virtual-environments) A partir de agora sempre assumirei que o ambiente virtual iniciado está ativo, ok? 

Faça a instalação do **Django** através do comando `pip install django`. 

Ao finalizar você terá acesso ao comando `django-admin` que possibilita fazer um série de subcomandos, veja abaixo:

![Subcomandos do django-admin](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fwwgy1ncs6k6ma2avlip.png)

O comando que utilizaremos, inicialmente, aqui é o: `startproject`. 

Passaremos dois argumentos adicionais: o primeiro será o nome da pasta que guardará os arquivos de configuração do projeto e o segundo será o local onde queremos criar essa pasta, usaremos um `.` para indicar que será no diretório atual.

O comando completo fica assim:

`django-admin startproject config .`

Escolhi o nome `config` dado que será a pasta que guardará as configurações gerais do meu projeto, e, se você me acompanhou até aqui, terá uma organização parecida com a que é mostrada abaixo:

![Arquivos que foram criados até então](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/snb93gqpdg98r3bpvoqh.png)

Nosso projeto já é executável, faça `python3 manage.py runserver` no terminal e acesse [127.0.0.1:8000](127.0.0.1:8000), veja o que te aguarda abaixo:

![Página inicial do projeto funcionando](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6u2w7r24z7nzsbcwmcgf.png)

---

## Entendendo os `urls.py` e `settings.py`

O arquivo `urls.py` representa a configuração de rotas do seu projeto **Django**, dentro da variável `urlpatterns` guardamos os caminhos e como lidaremos com aquele caminho (`view`). Podemos colocar uma classe, uma função, ou até mesmo inserir um outro arquivo de configuração de rotas. 

Por enquanto, não vamos inserir nada nesse arquivo, mas observe que na linha 21 já há uma rota implementada.

![Rota /admin já implementada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jqctpk5jhqket455cqk.png) 

Se tentarmos acessar a rota [127.0.0.1:8000/admin](127.0.0.1:8000/admin), caímos então no que chamamos de painel de administração do **Django**.

![Painel de administração do Django](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ur1m1m0g972jsz1sd9qi.png)

Na próximo _post_ desta série falaremos mais sobre o painel de administração, antes, vamos entender o `settings.py`. Nesse arquivo encontramos diversas configurações do projeto, citarei algumas delas aqui:

- `SECRET_KEY`: Variável que é usada para criptografia que já existe no projeto.
- `DEBUG`: Variável que indica se o projeto está em desenvolvimento ou produção.
- `ALLOWED_HOSTS`: Variável que contém domínios permitidos (uma segurança contra [ataques CSRF.](https://docs.djangoproject.com/en/5.0/ref/csrf/)
- `INSTALLED_APPS`: Variável que contém os `apps` instalados em seu projeto.
- `MIDDLEWARE`: Variável que contém os `middlewares` instalados em seu projeto.
- `ROOT_URLCONF`: Variável que contém o arquivo de configuração de rotas do projeto.
- `TEMPLATES`: Variável que contém a configuração de uso de templates do projeto.
- `DATABASES`: Variável que contém a configuração de uso de banco de dados do projeto.
- `LANGUAGE_CODE`: Idioma do projeto.
- `TIMEZONE`: Fuso horário a ser considerado pelo projeto.

Tenho certeza que algumas das configurações que citei ainda não estão completamente nítidas para você, mas não se preocupe. Trarei mais detalhes à medida que precisarmos. 

Enquanto isso, veja como é interessante, mude o valor de `LANGUAGE_CODE` para `pt-br` e de `TIMEZONE` para `America/Sao_Paulo`. Salve o código. Veja como no terminal agora temos um horário diferente do que era mostrado antes (Agora seguindo o fuso horário de Brasília) e ao acessar o painel de administração de novo, veja que está em português. 🤯

![Painel de administração, agora em português](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g35187edmg9yml5fv8eg.png)

---

## O banco de dados do **Django**

A configuração padrão para banco de dados do **Django** usa o SQLite, um banco de dados relacional em arquivo. Se essa configuração for mantida, ao executar o projeto, surgirá o arquivo `db.sqlite3`.

![Arquivo db.sqlite3 no projeto](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9ttzxk3ojfanvrf85b6.png)

Com o auxílio de uma [extensão do _VSCode_](https://marketplace.visualstudio.com/items?itemName=qwtel.sqlite-viewer) podemos inspecionar as tabelas do banco, que, no nosso caso, ainda não existem.

![Tabelas do arquivo db.sqlite3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjaj4wlvuggatem02ti1.png)

Você pode ter notado no terminal que uma mensagem em vermelho acompanha o terminal desde que subimos o projeto pela primeira vez.

![Mensagem sobre migrações a serem aplicadas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7kzimtctz8asw7ngbym6.png)

Essa mensagem mostra que o **Django** tem alterações à serem feitas no banco de dados e que ainda não foram aplicadas. Para fazer isso, execute o comando `python3 manage.py migrate`.

Agora, se inspecionamos o arquivo do banco novamente:

![Banco de dados com as tabelas atualizadas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1cotgbmj1s9nm7kwmk2.png)

Todas essas tabelas que estão dentro do banco são usadas pelo próprio **Django** para lidar com o sistema de usuários, grupos, permissões, sessões e até mesmo as próprias migrações que são aplicadas no banco.

Podemos inserir um novo registro no banco de dados criando um `superuser` através do comando `python3 manage.py createsuperuser` e interagindo no próprio terminal com os dados que são pedidos.

![Criação de um `superuser`](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/esz2lggkeqer56oksv9i.png)

Ao inspecionar a tabela `auth_user` no banco de dados temos agora um registro. (Caso não tenha aparecido para você, basta clicar no símbolo de atualizar logo acima das tabelas)

![Novo registro no banco](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7cuqzr7zi3uhzmid9ru.png)

Com esse acesso criado, você pode agora fazer login no painel de administração do **Django**!

![Dentro do painel de administração do Django](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a13a2kljvvpbfss2gkk0.png)

Agora, basta clicar em `Grupos` ou `Usuários` para conseguir visualizar, filtrar, pesquisar, adicionar, atualizar ou deletar registros referentes à cada uma desses modelos.

No próximo _post_, faremos a configuração do primeiro `app` que implementaremos. Nele, teremos um modelo e com ele você entenderá como melhorar a usabilidade do painel de administração para suas próprias implementações.