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/htmlcombinado 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_typee, 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: