Redirecionamento e Envio de Código de Status - Django
Redirecionamento
Quando uma página é movida de um endereço para outro, é necessário indicar aos usuários e aos mecanismos de busca que a página foi realocada. Isso pode ser feito utilizando redirecionamentos.
Os redirecionamentos podem ser classificados como temporários ou permanentes. No caso de um redirecionamento temporário, informa-se que a página foi movida para um novo endereço de forma provisória, retornando o código de status 302. Já em um redirecionamento permanente, a página é considerada realocada definitivamente, utilizando-se o código de status 301.
No Django, os redirecionamentos são implementados por meio das classes HttpResponseRedirect
HttpResponsePermanentRedirect
django.http
Por exemplo, considere o seguinte código no arquivo views.py
from django.http import HttpResponse, HttpResponseRedirect, HttpResponsePermanentRedirect
def index(request):
return HttpResponse("Index")
def about(request):
return HttpResponse("About")
def contact(request):
return HttpResponseRedirect("/about")
def details(request):
return HttpResponsePermanentRedirect("/")
No exemplo acima, a função contact()
/about
details()
/
No arquivo urls.py
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
path("about/", views.about),
path("contact/", views.contact),
path("details/", views.details),
]
Envio de Códigos de Status
Além de redirecionamentos, o Django permite o envio de respostas com códigos de status HTTP personalizados por meio de classes específicas do módulo django.http
Código de Status | Classe |
---|---|
304 (Not Modified) | HttpResponseNotModified |
400 (Bad Request) | HttpResponseBadRequest |
403 (Forbidden) | HttpResponseForbidden |
404 (Not Found) | HttpResponseNotFound |
405 (Method Not Allowed) | HttpResponseNotAllowed |
410 (Gone) | HttpResponseGone |
500 (Internal Server Error) | HttpResponseServerError |
Essas classes permitem a inclusão de mensagens detalhadas ao usuário, fornecidas como parâmetro no construtor. Exemplos:
HttpResponseNotModified()
HttpResponseBadRequest("Requisição inválida")
HttpResponseForbidden("Acesso proibido")
HttpResponseNotFound("Página não encontrada")
HttpResponseNotAllowed("Método não permitido")
HttpResponseGone("Conteúdo indisponível")
HttpResponseServerError("Erro interno no servidor")
A seguir, um exemplo prático. Considere o seguinte código no arquivo views.py
from django.http import HttpResponse, HttpResponseNotFound, HttpResponseForbidden, HttpResponseBadRequest
def index(request, id):
people = ["Tom", "Bob", "Sam"]
# Verifica se o ID está dentro do intervalo válido
if id in range(0, len(people)):
return HttpResponse(people[id])
# Retorna erro 404 se o índice for inválido
else:
return HttpResponseNotFound("Página não encontrada")
def access(request, age):
# Retorna erro 400 se a idade estiver fora do intervalo permitido
if age not in range(1, 111):
return HttpResponseBadRequest("Idade inválida")
# Retorna mensagem de acesso permitido para maiores de 17 anos
if age > 17:
return HttpResponse("Acesso permitido")
# Retorna erro 403 se a idade for insuficiente
else:
return HttpResponseForbidden("Acesso bloqueado: idade insuficiente")
No exemplo acima, a função index()
access()
No arquivo urls.py
from django.urls import path
from hello import views
urlpatterns = [
path("index/<int:id>", views.index),
path("access/<int:age>", views.access),
]
A rota index/<int:id>
people
access/<int:age
age
Além disso, as mensagens relacionadas aos acessos às rotas são exibidas no console do servidor Django, permitindo o monitoramento durante o desenvolvimento.