Django: DisallowedHost, «CSRF verification failed» e ficheiros estáticos em falta

Pôs o Django online e aparecem três erros que quase todos encontram: DisallowedHost, CSRF verification failed e a página sem estilos (os ficheiros estáticos dão 404). Têm uma coisa em comum: no seu computador funcionava porque o DEBUG estava ligado e o endereço era localhost. A resposta curta: são três definições do settings.py que têm de conhecer o domínio verdadeiro. Para pôr o Django a correr, veja primeiro o artigo base.

Os três erros, uma linha cada

Erro Causa Solução no settings.py
DisallowedHost: Invalid HTTP_HOST header O domínio com que abriu o site não está na lista de anfitriões permitidos. ALLOWED_HOSTS = ["asuaempresa.co.mz", "www.asuaempresa.co.mz"]. Inclua todos os nomes com que o site se abre.
CSRF verification failed (403) ao enviar um formulário Por trás de HTTPS, o Django não confia na origem do formulário. CSRF_TRUSTED_ORIGINS = ["https://asuaempresa.co.mz", "https://www.asuaempresa.co.mz"]. Desde o Django 4.0 tem de levar o protocolo.
Página sem estilos; ficheiros em /static/ dão 404 Com DEBUG = False o Django deixa de servir os estáticos. Defina STATIC_ROOT, corra python manage.py collectstatic e sirva essa pasta pelo servidor web (veja abaixo).

Os estáticos, passo a passo

1 Defina as duas linhas no settings.py:STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "staticfiles"
2 Junte tudo numa só pasta, dentro do ambiente da aplicação: python manage.py collectstaticRepita depois de cada actualização que mexa em ficheiros estáticos.
3 Faça o servidor web servir essa pasta. No cPanel, a forma simples é copiar (ou ligar) o conteúdo da staticfiles para uma pasta dentro da pasta pública do domínio, no caminho que o STATIC_URL indica. Num VPS, o nginx serve-a com um bloco location /static/ e um alias.
4 Reinicie a aplicação e recarregue sem cache (Ctrl+F5).

Há uma alternativa que dispensa o passo 3: o pacote whitenoise, que deixa o próprio Django servir os estáticos com eficiência. Segue-se a documentação dele: instala-se com o pip e acrescenta-se ao MIDDLEWARE.

Não resolva deixando o DEBUG = True. Com ele ligado, qualquer erro mostra a quem visita os seus caminhos, as definições e, por vezes, credenciais. O Django exige ALLOWED_HOSTS precisamente quando o DEBUG está desligado. Também nunca use ALLOWED_HOSTS = ["*"] em produção.
Atrás de um proxy com HTTPS (nginx num VPS), diga ao Django que o pedido original era seguro, ou o CSRF e os redireccionamentos falham: SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https"), e só se o proxy enviar esse cabeçalho e o apagar nos pedidos que vêm de fora. Veja gunicorn e systemd num VPS. Para as senhas e a chave secreta: variáveis de ambiente e segredos.

Ajustou o settings.py e o erro continua? Envie-nos o domínio e as últimas linhas do registo da aplicação.

Abrir um pedido de suporte

VEJA TAMBÉM

Pôr uma aplicação Django a correr

Variáveis de ambiente e segredos para a sua aplicação

Onde vão parar o console.log e o print, e como ler os registos da aplicação

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 321,75 MT/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?