Atualizado: 14/12/2024

Enviando respostas com HttpResponse

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 HTTP Content-Type. Se não for especificado, o Django assume o padrão text/html combinado com a configuração DEFAULT_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âmetro content_type e, caso não consiga, utiliza o valor da configuração DEFAULT_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 transmitir 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.

Inspecionando cabeçalhos retornados pelo servidor no navegador

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.

Console do desenvolvedor exibindo mensagem de erro com status 400

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.

Navegador renderizando o texto
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com