Enviando respostas com HttpResponse no Django
No Django, o envio de respostas ao cliente é realizado através da classe HttpResponse
, que faz parte do pacote django.http
. De maneira geral, para enviar dados ao cliente, é suficiente passá-los ao construtor da classe HttpResponse. Considere, por exemplo, uma função simples no arquivo views.py
que retorna uma resposta ao cliente:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello")
No arquivo urls.py
, essa função é associada a uma rota:
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
]
Essa função envia um texto para a instância de HttpResponse
, e o usuário visualizará esse conteúdo no navegador. Contudo, a funcionalidade de HttpResponse
não se limita a isso. O método de inicialização da classe aceita diversos parâmetros que permitem maior controle sobre a resposta:
HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None, headers=None)
Os parâmetros da classe HttpResponse
são:
content
: conteúdo da resposta como uma string de bytes. Caso outro tipo de dado seja fornecido, ele será convertido automaticamente.content_type
: tipo MIME da resposta, utilizado para definir o cabeçalho HTTPContent-Type
. Se não for especificado, o Django assume o padrãotext/html
combinado com a configuraçãoDEFAULT_CHARSET
, resultando em:text/html; charset=utf-8
.charset
: codificação do conteúdo. Por padrão, o Django tenta extrair a codificação do parâmetrocontent_type
e, caso não consiga, utiliza o valor da configuraçãoDEFAULT_CHARSET
.status
: código de status HTTP da resposta. O valor padrão é 200 (OK).reason
: frase associada ao código de status.headers
: cabeçalhos personalizados para a resposta, fornecidos como um dicionário.
Além dos parâmetros fornecidos, a classe HttpResponse
armazena informações sobre a resposta por meio de diversos atributos, incluindo:
content
: conteúdo da resposta em formato de bytes.headers
: cabeçalhos da resposta como um dicionário.charset
: codificação utilizada no conteúdo.status_code
: código de status HTTP.reason_phrase
: frase associada ao código de status.
Exemplos práticos
Adição de cabeçalhos personalizados
Cabeçalhos personalizados podem ser incluídos para enviar informações adicionais ao cliente. No exemplo abaixo, um cabeçalho SecretCode
é definido:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello www.programicio.com!", headers={"SecretCode": "21234567"})
Apesar de o cabeçalho SecretCode
não fazer parte do padrão HTTP, ele pode ser utilizado para enviar informações específicas ao cliente. Utilizando as ferramentas de desenvolvedor no navegador, é possível inspecionar os cabeçalhos retornados pelo servidor e verificar a presença desse cabeçalho personalizado.
Definição de Código de Status
from django.http import HttpResponse
def index(request):
return HttpResponse("Ocorreu um erro", status=400, reason="Dados incorretos")
Nesse caso, o servidor retorna o status 400 junto com a mensagem "Dados incorretos" no cabeçalho da resposta.
Configuração do tipo de conteúdo e codificação
O cabeçalho Content-Type
pode ser configurado para alterar a forma como o navegador interpreta o conteúdo. No exemplo abaixo, o conteúdo contém uma tag HTML, mas é tratado como texto simples devido ao tipo MIME configurado:
from django.http import HttpResponse
def index(request):
return HttpResponse("<h1>Hello</h1>", content_type="text/plain", charset="utf-8")
Mesmo com a presença da tag <h1>
, o navegador renderiza o conteúdo como texto puro, uma vez que o cabeçalho Content-Type
está definido como text/plain
.
Documentação oficial: