O Django fornece Bad Request (400) quando DEBUG = False


254

Eu sou novo no django-1.6. Quando executo o servidor django DEBUG = True, ele está funcionando perfeitamente. Mas quando mudo DEBUGpara Falseno arquivo de configurações, o servidor parou e dá o seguinte erro no prompt de comando:

CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

Depois que mudei ALLOWED_HOSTSpara ["http://127.0.0.1:8000",], no navegador, recebo o erro:

Bad Request (400)

É possível executar o Django sem o modo de depuração?


Uma coisa a lembrar: não adicione 'http' ou 'https' noALLOWED_HOSTS
shellbye 25/09/16

Respostas:


415

A ALLOWED_HOSTSlista deve conter nomes de host totalmente qualificados , não URLs. Deixe de fora a porta e o protocolo. Se você estiver usando 127.0.0.1, eu adicionaria localhostà lista também:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Você também pode usar *para corresponder a qualquer host:

ALLOWED_HOSTS = ['*']

Citando a documentação:

Os valores nesta lista podem ser nomes totalmente qualificados (por exemplo 'www.example.com'), caso em que serão correspondidos exatamente com o Hostcabeçalho da solicitação (sem distinção entre maiúsculas e minúsculas, sem incluir porta ). Um valor começando com um período pode ser usado como um curinga subdomínio: '.example.com'irá corresponder example.com, www.example.come qualquer outro subdomínio example.com. Um valor de '*'corresponderá a qualquer coisa; nesse caso, você é responsável por fornecer sua própria validação do Hostcabeçalho (talvez em um middleware; nesse caso, esse middleware deve ser listado primeiro MIDDLEWARE_CLASSES).

Negrito ênfase minha .

A resposta do status 400 que você recebe ocorre devido a uma SuspiciousOperationexceção ser levantada quando o cabeçalho do host não corresponde a nenhum valor nessa lista.


3
Graças ele funciona, mas quando eu definir Falso, uma questão vem, para todos os arquivos estáticos é mostrada como 404. Eu não conseguia entender por que ele não dá encontrada
MegaBytes

@MegaBytes: desculpe, não sei o que pode ser.
Martijn Pieters

1
Você pode me sugerir como fazê-lo, porque meu projeto está em produção.
MegaBytes

Mais uma vez, não faço ideia do que você está definindo False. Talvez você possa postar uma nova pergunta?
Martijn Pieters

9
@MegaBytes Quando DEBUG é False, todos os arquivos estáticos são servidos a partir do STATIC_ROOT, então provavelmente o ./manage.py collectstaticfará.
usar o seguinte código

6

Para mim, recebi esse erro ao não definir USE_X_FORWARDED_HOSTcomo verdadeiro. Dos documentos:

Isso só deve ser ativado se um proxy que define esse cabeçalho estiver em uso.

Meu serviço de hospedagem escreveu explicitamente em sua documentação que essa configuração deve ser usada, e eu recebo esse erro 400 se o esquecer.


Isso é necessário se ALLOWED_HOSTS = ['*']?
precisa

1
Eu acho que ALLOWED_HOSTS bloqueia todo o host. USE_X_FORWARDED_HOST determina apenas se um cabeçalho HTTP é usado.
Keith

3

Eu tive o mesmo problema e o corrigi definindo ALLOWED_HOSTS = ['*']e resolvendo o problema com as imagens estáticas, é necessário alterar os caminhos virtuais na configuração do ambiente da seguinte maneira:

                Diretório de caminho virtual

/ static / / opt / python / current / app / yourpj / static /
/ media / / opt / python / current / app / Nuevo / media /

Espero que ajude você.

PD: desculpe pelo meu inglês ruim.


2

Eu tive o mesmo problema e nenhuma das respostas resolveu o meu problema. Para resolver uma situação como essa, é melhor ativar o log adicionando a seguinte configuração a settings.pytemporário

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/tmp/debug.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }

e tente tail -f /tmp/debug.log. e quando você vir seu problema, poderá lidar com isso com muito mais facilidade do que a depuração às cegas.

Meu problema estava prestes a

Cabeçalho HTTP_HOST inválido: 'pt_web: 8000'. O nome de domínio fornecido não é válido de acordo com a RFC 1034/1035.

e resolva-o adicionando proxy_set_header Host $host;ao arquivo de configuração do Nginx e ativando o encaminhamento de porta USE_X_FORWARDED_PORT = Trueno settings.py(é porque no meu caso, ouvi pedidos no Nginx na porta 8080e passá-lo para gunia porta8000


Obrigado por compartilhar. Para o meu caso no prod, depois de adicionar o LOGGING = ..., vejo o erro "ValueError: falta de entrada de manifesto de arquivos estáticos para ... css". Então eu uso "python manager.py collectstatic" como mencionado acima por @ Blackeagle52, o erro 500 (também pode ser um erro 400 no meu dev local) foi resolvido.
Zhihong 3/10

1

Para mim, como eu já tenho o xampp no ​​127.0.0.1 e o django no 127.0.1.1 e continuei tentando adicionar hosts

ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'www.yourdomain.com', '*', '127.0.1.1']

e recebi o mesmo erro ou (400) solicitação incorreta insira a descrição da imagem aqui

então mudo a url para 127.0.1.1:(o porto usado) / project e pronto!

você tem que verificar qual é o seu endereço de rede virtual, para mim, como eu uso o bitnami django stack 2.2.3-1 no Linux, posso verificar qual porta o django está usando. se você tiver um erro (400 pedido ruim), então eu acho que django em diferentes redes virtuais .. boa sorte insira a descrição da imagem aqui


0

No DEBUG = Falsearquivo de configurações, você também precisa da lista ALLOWED_HOST configurada. Tente incluirALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

Caso contrário, você poderá receber um erro de solicitação inválida (400) do django.


0

Tente executar seu servidor com o --insecure da seguinte maneira:

python manage.py runserver --inseguro


0

Eu tive que parar o servidor apache primeiro.

(fe sudo systemctl stop httpd.service/ sudo systemctl disable httpd.service).

Isso resolveu meu problema além de editar o settings.pyarquivo ' '

para ALLOWED_HOSTS = ['se.rv.er.ip', 'www.example.com']


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.