Django ให้คำขอที่ไม่ดี (400) เมื่อ DEBUG = False


254

ฉันใหม่กับ django-1.6 เมื่อฉันรันเซิร์ฟเวอร์ django ด้วยDEBUG = Trueมันทำงานได้อย่างสมบูรณ์ แต่เมื่อฉันเปลี่ยนDEBUGเป็นFalseในไฟล์การตั้งค่าเซิร์ฟเวอร์หยุดทำงานและมันให้ข้อผิดพลาดต่อไปนี้บนพรอมต์คำสั่ง:

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

หลังจากที่ฉันเปลี่ยนALLOWED_HOSTSเป็น["http://127.0.0.1:8000",]ในเบราว์เซอร์ฉันได้รับข้อผิดพลาด:

Bad Request (400)

เป็นไปได้ไหมที่จะใช้งาน Django โดยไม่ใช้โหมดดีบั๊ก


สิ่งหนึ่งที่ควรจดจำ: อย่าเพิ่ม 'http' หรือ 'https' ในALLOWED_HOSTS
shellbye

คำตอบ:


415

ALLOWED_HOSTSรายการควรมีคุณสมบัติครบถ้วนชื่อโฮสต์ , ไม่ URL ที่ ออกจากพอร์ตและโปรโตคอล หากคุณกำลังใช้127.0.0.1ฉันจะเพิ่มlocalhostเข้าไปในรายการด้วย:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

คุณสามารถใช้*จับคู่กับโฮสต์ใดก็ได้ :

ALLOWED_HOSTS = ['*']

การอ้างถึงเอกสาร:

ค่าในรายการนี้อาจเป็นชื่อที่ผ่านการรับรองโดยสมบูรณ์ (เช่น'www.example.com') ซึ่งในกรณีนี้พวกเขาจะถูกจับคู่กับHostส่วนหัวของคำขออย่างแน่นอน (ไม่คำนึงถึงขนาดตัวพิมพ์ไม่รวมถึงพอร์ต ) ค่าเริ่มต้นด้วยระยะเวลาที่สามารถใช้เป็นสัญลักษณ์แทนโดเมนย่อย: '.example.com'จะตรงกับexample.com, www.example.comและโดเมนย่อยอื่น ๆ example.comของ มูลค่าของ'*'จะตรงกับสิ่งใด ในกรณีนี้คุณมีหน้าที่รับผิดชอบในการตรวจสอบความถูกต้องของHostส่วนหัวของคุณเอง(อาจเป็นมิดเดิลแวร์หากมิดเดิลแวร์นี้ต้องแสดงรายการก่อนMIDDLEWARE_CLASSES)

ผมขอย้ำหนา

การตอบสนองสถานะ 400 ที่คุณได้รับเกิดจากSuspiciousOperationข้อยกเว้นที่ถูกยกขึ้นเมื่อส่วนหัวโฮสต์ของคุณไม่ตรงกับค่าใด ๆ ในรายการนั้น


3
ขอบคุณมันใช้งานได้ แต่เมื่อฉันตั้งค่า False ปัญหาหนึ่งมาสำหรับไฟล์คงที่ทั้งหมดจะแสดงเป็น 404 ฉันไม่สามารถเข้าใจว่าทำไมมันถึงไม่พบ
MegaBytes

@ MegaBytes: ขอโทษฉันไม่รู้ว่ามันอาจจะเป็นอะไร
Martijn Pieters

1
คุณช่วยแนะนำฉันให้ทำได้อย่างไรเพราะโครงการของฉันกำลังดำเนินการอยู่
MegaBytes

Falseอีกครั้งผมมีความคิดแม้กระทั่งสิ่งที่คุณกำลังตั้งไม่มี คุณอาจโพสต์คำถามใหม่ได้หรือไม่?
Martijn Pieters

9
@MegaBytes เมื่อ DEBUG เป็นเท็จไฟล์สแตติกทั้งหมดจะถูกส่งจาก STATIC_ROOT ดังนั้น./manage.py collectstaticอาจเป็นไปได้
Blackeagle52

6

สำหรับฉันฉันได้รับข้อผิดพลาดนี้โดยไม่ตั้งค่าUSE_X_FORWARDED_HOSTเป็นจริง จากเอกสาร:

ควรเปิดใช้งานนี้เฉพาะเมื่อมีการใช้พรอกซีซึ่งตั้งค่าส่วนหัวนี้

บริการโฮสติ้งของฉันเขียนไว้อย่างชัดเจนในเอกสารประกอบว่าต้องใช้การตั้งค่านี้และฉันได้รับข้อผิดพลาด 400 ข้อนี้หากฉันลืม


จำเป็นหรือไม่ถ้า ALLOWED_HOSTS = ['*']
Mike Stoddart

1
ฉันคิดว่า ALLOWED_HOSTS บล็อกโฮสต์ทั้งหมด USE_X_FORWARDED_HOST จะกำหนดว่าจะใช้ส่วนหัว HTTP หรือไม่
Keith

3

ฉันมีปัญหาเดียวกันและฉันแก้ไขได้โดยการตั้งค่าALLOWED_HOSTS = ['*']และเพื่อแก้ไขปัญหาเกี่ยวกับรูปภาพนิ่งที่คุณต้องเปลี่ยนเส้นทางเสมือนในการกำหนดค่าสภาพแวดล้อมเช่นนี้:

                ไดเรกทอรีเส้นทางเสมือน

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

ฉันหวังว่ามันจะช่วยคุณ

PD: ขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน


2

ฉันมีปัญหาเดียวกันและไม่มีคำตอบที่แก้ไขปัญหาของฉันสำหรับการแก้ไขสถานการณ์เช่นนี้จะเป็นการดีกว่าถ้าเปิดใช้งานการบันทึกโดยเพิ่มการตั้งค่าต่อไปนี้settings.pyเป็นการชั่วคราว

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

tail -f /tmp/debug.logและพยายามที่จะ และเมื่อคุณเห็นปัญหาของคุณคุณสามารถจัดการได้ง่ายกว่าการดีบักแบบ blind

ปัญหาของฉันกำลังจะ

ส่วนหัว HTTP_HOST ไม่ถูกต้อง: 'pt_web: 8000' ชื่อโดเมนที่ระบุไม่ถูกต้องตาม RFC 1034/1035

และแก้ไขโดยเพิ่มproxy_set_header Host $host;ไฟล์ Nginx config และเปิดใช้งานการส่งต่อพอร์ตโดยUSE_X_FORWARDED_PORT = Trueในsettings.py(เพราะในกรณีของฉันฉันได้ฟังคำขอใน Nginx บนพอร์ต8080และส่งต่อไปยังguniพอร์ต8000


ขอบคุณสำหรับการแบ่งปัน. สำหรับกรณีของฉันใน prod หลังจากฉันเพิ่ม LOGGING = ... แล้วฉันเห็นข้อผิดพลาด "ValueError: ไม่มีรายการรายการ staticfiles สำหรับ ... css" จากนั้นฉันใช้ "python manager.py collectstatic" ตามที่กล่าวไว้ข้างต้นโดย @ Blackeagle52 ข้อผิดพลาด 500 (สามารถเป็น 400 ข้อผิดพลาดใน dev ท้องถิ่นของฉัน) ได้รับการแก้ไข
zhihong

1

สำหรับฉันแล้วฉันได้ xampp ที่ 127.0.0.1 และ django ที่ 127.0.1.1 และฉันพยายามเพิ่มโฮสต์

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

และฉันได้รับข้อผิดพลาดเดียวกันหรือ (400) คำขอไม่ถูกต้อง ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นฉันจึงเปลี่ยน URL เป็น 127.0.1.1:( พอร์ตที่ใช้) / โครงการและ voila!

คุณต้องตรวจสอบที่อยู่เครือข่ายเสมือนของคุณสำหรับฉันในขณะที่ฉันใช้ bitnami django stack 2.2.3-1 บน Linux ฉันสามารถตรวจสอบพอร์ต django ที่ใช้อยู่ได้ หากคุณมีข้อผิดพลาด (400 คำขอไม่ดี) ฉันเดา django บนเครือข่ายเสมือนที่แตกต่างกัน .. ขอให้โชคดี ป้อนคำอธิบายรูปภาพที่นี่


0

ด้วยDEBUG = Falseในตัวคุณตั้งค่าไฟล์คุณยังต้องรายการ ALLOWED_HOST ตั้งค่า ลองใส่ALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

มิฉะนั้นคุณอาจได้รับข้อผิดพลาด Bad Request (400) จาก django


0

ลองเรียกใช้เซิร์ฟเวอร์ของคุณด้วย - มั่นใจเช่นนี้:

หลาม Manage.py runserver - การรักษาความปลอดภัย


0

ฉันต้องหยุดเซิร์ฟเวอร์ apache ก่อน

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

ที่แก้ไขปัญหาของฉันนอกเหนือจากการแก้ไขsettings.pyไฟล์ ''

ถึง ALLOWED_HOSTS = ['se.rv.er.ip', 'www.example.com']


-4

นำทางไปยังการตั้งค่าและค้นหาไฟล์ base.py ตั้งค่าโฮสต์ที่อนุญาตเป็น ALLOWED_HOSTS = ['*']


4
อย่าตอบซ้ำคำตอบที่ยอมรับได้ ลบตัวเลือกนี้เพื่อทำความสะอาดฟอรั่ม
WoodChopper

อย่าตอบแบบนี้แสดงความคิดเห็น
Adnan Abdollah Zaki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.