Criação de um Aplicativo de Enquetes Básico

Advanced

Introdução

Neste tutorial, vamos guiá-lo através da criação de uma aplicação de votação básica.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível avançado com uma taxa de conclusão de 29%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Visão Geral

Vamos aprender por meio de exemplos.

Ao longo deste tutorial, vamos guiá-lo através da criação de uma aplicação de votação básica.

Ela consistirá em duas partes:

  • Um site público que permite às pessoas visualizar as votações e votar nelas.
  • Um site de administração que permite adicionar, alterar e excluir votações.

Vamos assumir que você já tem o Django instalado. Você pode verificar se o Django está instalado e qual versão executando o seguinte comando em um prompt de shell:

python -m django --version

Se o Django estiver instalado, você deverá ver a versão da sua instalação. Caso contrário, você receberá um erro informando "No module named django".

Este tutorial foi escrito para o Django, que suporta Python 3.10 e versões posteriores. Se a versão do Django não corresponder, você pode consultar o tutorial para sua versão do Django usando o seletor de versão no canto inferior direito desta página, ou atualizar o Django para a versão mais recente.

Criando um projeto

Se esta é a sua primeira vez usando o Django, você precisará cuidar de algumas configurações iniciais. Especificamente, você precisará gerar automaticamente algum código que estabelece um project do Django -- uma coleção de configurações para uma instância do Django, incluindo configuração de banco de dados, opções específicas do Django e configurações específicas da aplicação.

Na linha de comando, use cd para entrar em um diretório onde você gostaria de armazenar seu código e, em seguida, execute o seguinte comando:

cd ~/project
django-admin startproject mysite

Isso criará um diretório mysite no seu diretório atual.

Vamos dar uma olhada no que startproject criou:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

Esses arquivos são:

  • O diretório raiz externo mysite/ é um contêiner para o seu projeto. Seu nome não importa para o Django; você pode renomeá-lo para o que quiser.
  • manage.py: Um utilitário de linha de comando que permite interagir com este projeto Django de várias maneiras.
  • O diretório interno mysite/ é o pacote Python real para o seu projeto. Seu nome é o nome do pacote Python que você precisará usar para importar qualquer coisa dentro dele (por exemplo, mysite.urls).
  • mysite/__init__.py: Um arquivo vazio que informa ao Python que este diretório deve ser considerado um pacote Python.
  • mysite/settings.py: Configurações/configuração para este projeto Django.
  • mysite/urls.py: As declarações de URL para este projeto Django; um "sumário" do seu site com tecnologia Django.
  • mysite/asgi.py: Um ponto de entrada para servidores web compatíveis com ASGI para servir seu projeto.
  • mysite/wsgi.py: Um ponto de entrada para servidores web compatíveis com WSGI para servir seu projeto.

O servidor de desenvolvimento

Vamos verificar se o seu projeto Django funciona. Mude para o diretório mysite externo, se ainda não o fez, e execute os seguintes comandos:

cd ~/project/mysite
python manage.py runserver

Você verá a seguinte saída na linha de comando:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them.

- 15:50:53 Django version , using settings 'mysite.settings' Starting development server at <http://127.0.0.1:8000/> Quit the server with CONTROL-C.

Ignore o aviso sobre migrações de banco de dados não aplicadas por enquanto; lidaremos com o banco de dados em breve.

Você iniciou o servidor de desenvolvimento Django, um servidor web leve escrito puramente em Python. Incluímos isso com o Django para que você possa desenvolver as coisas rapidamente, sem ter que lidar com a configuração de um servidor de produção -- como o Apache -- até que esteja pronto para a produção.

Agora é um bom momento para notar: não use este servidor em nada que se assemelhe a um ambiente de produção. Ele se destina apenas ao uso durante o desenvolvimento. (Estamos no negócio de fazer frameworks web, não servidores web.)

Agora que o servidor está em execução, visite http://127.0.0.1:8000/ com seu navegador web. Ou, execute curl 127.0.0.1:8000 no terminal. Você verá uma página "Parabéns!", com um foguete decolando. Funcionou!

Na VM LabEx, precisamos adicionar o domínio LabEx a ALLOWED_HOSTS. Edite mysite/settings.py e adicione * ao final de ALLOWED_HOSTS, para que fique assim:

ALLOWED_HOSTS = ["*"]

Isso informa ao Django que ele pode servir solicitações com qualquer cabeçalho de host.

Django development server running

Alterando a porta

Por padrão, o comando runserver inicia o servidor de desenvolvimento no IP interno na porta 8000.

Se você quiser alterar a porta do servidor, passe-a como um argumento de linha de comando. Por exemplo, este comando inicia o servidor na porta 8080:

python manage.py runserver 8080

Se você quiser alterar o IP do servidor, passe-o junto com a porta. Por exemplo, para ouvir em todos os IPs públicos disponíveis (o que é útil se você estiver executando o Vagrant ou quiser mostrar seu trabalho em outros computadores na rede), use:

python manage.py runserver 0.0.0.0:8080

Agora, mude para a aba Web 8080 na VM LabEx e você verá a mesma página "Parabéns".

Django development server page

A documentação completa para o servidor de desenvolvimento pode ser encontrada na referência runserver.

Recarregamento automático de runserver
O servidor de desenvolvimento recarrega automaticamente o código Python para cada solicitação, conforme necessário. Você não precisa reiniciar o servidor para que as alterações no código entrem em vigor. No entanto, algumas ações, como adicionar arquivos, não acionam uma reinicialização, então você terá que reiniciar o servidor nesses casos.

Criando o aplicativo Polls

Agora que seu ambiente -- um "projeto" -- está configurado, você está pronto para começar a trabalhar.

Cada aplicação que você escreve em Django consiste em um pacote Python que segue uma certa convenção. Django vem com um utilitário que gera automaticamente a estrutura básica de diretórios de um aplicativo, para que você possa se concentrar em escrever código em vez de criar diretórios.

Projetos vs. aplicativos
Qual é a diferença entre um projeto e um aplicativo? Um aplicativo é uma aplicação web que faz algo -- por exemplo, um sistema de blog, um banco de dados de registros públicos ou um pequeno aplicativo de enquetes. Um projeto é uma coleção de configurações e aplicativos para um determinado site. Um projeto pode conter vários aplicativos. Um aplicativo pode estar em vários projetos.

Seus aplicativos podem viver em qualquer lugar no seu Python path <tut-searchpath>. Neste tutorial, criaremos nosso aplicativo de enquetes no mesmo diretório do seu arquivo manage.py para que ele possa ser importado como seu próprio módulo de nível superior, em vez de um submódulo de mysite.

Para criar seu aplicativo, certifique-se de estar no mesmo diretório que manage.py e digite este comando:

cd ~/project/mysite
python manage.py startapp polls

Isso criará um diretório polls, que é organizado assim:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

Esta estrutura de diretórios abrigará a aplicação de enquetes.

Escreva sua primeira view

Vamos escrever a primeira view. Abra o arquivo polls/views.py e coloque o seguinte código Python nele:

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

Esta é a view mais simples possível em Django. Para chamar a view, precisamos mapeá-la para uma URL - e para isso precisamos de um URLconf.

Para criar um URLconf no diretório polls, crie um arquivo chamado urls.py. Seu diretório de aplicativo agora deve ser assim:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

No arquivo polls/urls.py, inclua o seguinte código:

from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

A próxima etapa é apontar o URLconf raiz para o módulo polls.urls. Em mysite/urls.py, adicione uma importação para django.urls.include e insira um ~django.urls.include na lista urlpatterns, para que você tenha:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

A função ~django.urls.include permite referenciar outros URLconfs. Sempre que Django encontra ~django.urls.include, ele corta a parte da URL que correspondeu até aquele ponto e envia a string restante para o URLconf incluído para processamento adicional.

A ideia por trás de ~django.urls.include é facilitar o plug-and-play de URLs. Como as enquetes estão em seu próprio URLconf (polls/urls.py), elas podem ser colocadas em "/polls/", ou em "/fun_polls/", ou em "/content/polls/", ou em qualquer outra raiz de caminho, e o aplicativo ainda funcionará.

Quando usar ~django.urls.include()
Você sempre deve usar include() ao incluir outros padrões de URL. admin.site.urls é a única exceção a isso.

Você agora conectou uma view index ao URLconf. Verifique se está funcionando com o seguinte comando:

python manage.py runserver 0.0.0.0:8080

Vá para <http:///polls/> no seu navegador e você deverá ver o texto "Hello, world. You're at the polls index.", que você definiu na view index.

Django URLconf structure

A função ~django.urls.path recebe quatro argumentos, dois obrigatórios: route e view, e dois opcionais: kwargs e name. Neste ponto, vale a pena revisar para que servem esses argumentos.

Argumento ~django.urls.path: route

route é uma string que contém um padrão de URL. Ao processar uma solicitação, Django começa no primeiro padrão em urlpatterns e percorre a lista, comparando a URL solicitada com cada padrão até encontrar um que corresponda.

Os padrões não pesquisam parâmetros GET e POST, ou o nome de domínio. Por exemplo, em uma solicitação para https://www.example.com/myapp/, o URLconf procurará por myapp/. Em uma solicitação para https://www.example.com/myapp/?page=3, o URLconf também procurará por myapp/.

Argumento ~django.urls.path: view

Quando Django encontra um padrão correspondente, ele chama a função de view especificada com um objeto ~django.http.HttpRequest como o primeiro argumento e quaisquer valores "capturados" da rota como argumentos de palavra-chave. Daremos um exemplo disso em breve.

Argumento ~django.urls.path: kwargs

Argumentos de palavra-chave arbitrários podem ser passados em um dicionário para a view de destino. Não vamos usar este recurso do Django no tutorial.

Argumento ~django.urls.path: name

Nomear sua URL permite que você se refira a ela de forma inequívoca de outras partes do Django, especialmente de dentro dos templates. Este recurso poderoso permite que você faça alterações globais nos padrões de URL do seu projeto, tocando apenas em um único arquivo.

Resumo

Parabéns! Você concluiu o laboratório de Criação de um Aplicativo de Enquetes Básico. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.