O método POST
Recebendo um POST na view
Quando acessamos a página na URL http://localhost:8000/
, o navegador faz uma requisição GET para o servidor. Quando preenchemos o formulário de criação de anotações e apertamos o botão de submissão, o navegador faz uma requisição POST para a mesma URL, enviando as informações do formulário. Como podemos saber a diferença?
O objeto request
recebido como argumento nas suas views possui um atributo method
. Esse atributo é uma string contendo o nome do método em letras maiúsculas ('GET'
ou 'POST'
). Além disso, caso seja uma requisição do tipo POST, haverá também um atributo POST
com um dicionário (na verdade um dictionary-like) cujas chaves são os nomes (atributo name
dos inputs do formulário) dos inputs e os valores são os valores preenchidos pelo usuário.
Exercício 1
Exercício 2
Resposta
Quando recarregamos a página, o navegador repete a requisição feita. Como a requisição que resultou nessa página foi um POST com os dados da nova anotação no formulário, uma nova anotação é criada.
Redirecionando a resposta#
Assim como existem diferentes tipos de requisição (GET e POST - existem outros, mas não vamos nos preocupar com eles por enquanto), existem também diferentes tipos de resposta. Toda resposta HTTP possui um código de status. São números entre 100 e 599. O mais comum de todos é o status 200, que significa que a requisição foi bem sucedida. Você já deve ter se deparado com pelo menos outros 2 ao longo de sua vida: o status 500 (erro do servidor - internal server error) e o status 404 (não encontrado). Na página anterior, tivemos também o erro 403 (acesso proibido). Cada código possui um significado, mas conhecê-los não é o nosso objetivo no momento1.
Você não precisa saber todos os códigos de cor, mas acabará decorando os principais depois de usar algumas vezes. O que importa para nós desta discussão é que existe um código específico que indica um redirecionamento. A resposta com redirecionamento faz com que o navegador faça uma nova requisição para um novo endereço. É mais ou menos como se fosse uma placa na frente de uma loja dizendo "estamos temporariamente atendendo neste outro endereço".
Fizemos esta digressão para apresentarmos uma solução muito comum para o problema que encontramos em nosso último exercício. Sempre que recebermos uma requisição POST, fazemos o que foi solicitado e, ao invés de devolvermos a página HTML, devolvemos uma resposta de redirecionamento para o mesmo endereço. Assim, o navegador fará uma nova requisição GET para esse endereço. Veja o exercício abaixo:
Exercício 3
O que significa o 'index'
usado como argumento da função redirect
?
Por acaso é o mesmo nome da função, mas o Django procura pelo nome na lista de padrões de url no arquivo urls.py
.
Exercício 4
Resposta
A redirect
usa o argumento para encontrar um padrão de url com o mesmo nome.
Exercício 5
Nosso próximo passo é receber parâmetros no caminho da URL.
-
Caso tenha curiosidade, os códigos são organizados em famílias: de 100 a 199 são respostas de informação, de 200 a 299, respostas de sucesso, de 300 a 399, respostas de redirecionamento, de 400 a 499, respostas de erro do cliente, de 500 a 599, respostas de erro do servidor. Você pode ler este documento da Mozilla que explica os códigos existentes. Ou você pode consultar as versões com gatinhos, que são muito melhores: https://httpcats.com/ e https://http.cat/. ↩