The Python Oracle

Django gives Bad Request (400) when DEBUG = False

Become part of the top 3% of the developers by applying to Toptal https://topt.al/25cXVn

--

Music by Eric Matyas
https://www.soundimage.org
Track title: Puzzle Game 5

--

Chapters
00:00 Question
00:50 Accepted answer (Score 483)
02:29 Answer 2 (Score 14)
03:47 Answer 3 (Score 7)
04:19 Answer 4 (Score 4)
04:46 Thank you

--

Full question
https://stackoverflow.com/questions/1987...

Accepted answer links:
[ALLOWED_HOSTS]: https://docs.djangoproject.com/en/stable...
[SuspiciousOperation]: https://docs.djangoproject.com/en/stable...

Answer 3 links:
[USE_X_FORWARDED_HOST]: https://docs.djangoproject.com/en/1.9/re...
[wrote]: https://wiki.uberspace.de/cool:django#dj...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#python #django

#avk47



ACCEPTED ANSWER

Score 501


The ALLOWED_HOSTS list should contain fully qualified host names, not urls. Leave out the port and the protocol. If you are using 127.0.0.1, I would add localhost to the list too:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

You could also use * to match any host:

ALLOWED_HOSTS = ['*']

Quoting the documentation:

Values in this list can be fully qualified names (e.g. 'www.example.com'), in which case they will be matched against the request’s Host header exactly (case-insensitive, not including port). A value beginning with a period can be used as a subdomain wildcard: '.example.com' will match example.com, www.example.com, and any other subdomain of example.com. A value of '*' will match anything; in this case you are responsible to provide your own validation of the Host header (perhaps in a middleware; if so this middleware must be listed first in MIDDLEWARE_CLASSES).

Bold emphasis mine.

The status 400 response you get is due to a SuspiciousOperation exception being raised when your host header doesn't match any values in that list.




ANSWER 2

Score 17


I had the same problem and none of the answers resolved my problem. For resolving situations like this, it's best to enable logging by adding the following config to settings.py temporarily.

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,
      },
   },
}

When you see the issue, it's easier to handle than by blind debugging.

My issue was:

Invalid HTTP_HOST header: 'pt_web:8000'. The domain name provided is not valid according to RFC 1034/1035.

I resolved it by adding proxy_set_header Host $host; to the Nginx config file and enabling port forwarding with USE_X_FORWARDED_PORT = True in the settings.py (it's because in my case I was listening to requests on Nginx port 8080 and passing to guni on port 8000).




ANSWER 3

Score 7


For me, I got this error by not setting USE_X_FORWARDED_HOST to true. From the docs:

This should only be enabled if a proxy which sets this header is in use.

My hosting service wrote explicitly in their documentation that this setting must be used, and I get this 400 error if I forget it.




ANSWER 4

Score 3


I had the same problem and I fixed it by setting ALLOWED_HOSTS = ['*'] and to solve the problem with the static images you have to change the virtual paths in the environment configuration like this:

Virtual Path                 Directory

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

I hope it helps you.

PD: sorry for my bad english.