Django memberikan Permintaan Buruk (400) saat DEBUG = Salah

254

Saya baru mengenal Django-1.6. Ketika saya menjalankan server Django dengan DEBUG = True, itu berjalan dengan sempurna. Tetapi ketika saya mengubah DEBUGke Falsedalam file pengaturan, maka server berhenti dan memberikan kesalahan berikut pada prompt perintah:

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

Setelah saya ubah ALLOWED_HOSTSke ["http://127.0.0.1:8000",], di browser saya mendapatkan kesalahan:

Bad Request (400)

Apakah mungkin menjalankan Django tanpa mode debug?

pembuat kode
sumber
Satu hal yang perlu diingat: jangan tambahkan 'http' atau 'https' diALLOWED_HOSTS
shellbye

Jawaban:

415

The ALLOWED_HOSTSdaftar harus berisi memenuhi syarat nama host , tidak url. Tinggalkan port dan protokolnya. Jika Anda menggunakan 127.0.0.1, saya akan menambahkan localhostke daftar juga:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Anda juga dapat menggunakan *untuk mencocokkan host mana pun :

ALLOWED_HOSTS = ['*']

Mengutip dokumentasi:

Nilai dalam daftar ini dapat berupa nama yang sepenuhnya memenuhi syarat (mis. 'www.example.com'), Dalam hal ini mereka akan dicocokkan dengan Hostheader permintaan secara tepat (case-insensitive, tidak termasuk port ). Nilai dimulai dengan periode dapat digunakan sebagai wildcard subdomain: '.example.com'akan cocok example.com, www.example.comdan setiap subdomain lain example.com. Nilai '*'akan cocok dengan apa pun; dalam hal ini Anda bertanggung jawab untuk memberikan validasi Hostheader Anda sendiri (mungkin dalam middleware; jika demikian middleware ini harus didaftar pertama kali dalam MIDDLEWARE_CLASSES).

Penekanan berani saya .

Respons status 400 yang Anda dapatkan disebabkan oleh SuspiciousOperationpengecualian yang diajukan ketika header host Anda tidak cocok dengan nilai apa pun dalam daftar itu.

Martijn Pieters
sumber
3
Terima kasih itu bekerja, Tapi ketika saya mengatur False, satu masalah datang, untuk semua file statis ditampilkan sebagai 404. Saya tidak bisa mengerti mengapa itu tidak ditemukan
MegaBytes
@MegaBytes: maaf, saya tidak tahu apa itu.
Martijn Pieters
1
Dapatkah Anda menyarankan saya bagaimana melakukannya, karena proyek saya sedang diproduksi.
MegaBytes
Sekali lagi, saya tidak tahu bahkan apa yang Anda tetapkan False. Mungkin Anda bisa memposting pertanyaan baru?
Martijn Pieters
9
@MegaBytes Ketika DEBUG salah, semua file statis dilayani dari STATIC_ROOT, jadi mungkin ./manage.py collectstaticakan dilakukan.
Blackeagle52
6

Bagi saya, saya mendapatkan kesalahan ini dengan tidak menyetel USE_X_FORWARDED_HOSTke true. Dari dokumen:

Ini seharusnya hanya diaktifkan jika proxy yang menetapkan header ini digunakan.

Layanan hosting saya menulis secara eksplisit dalam dokumentasi mereka bahwa pengaturan ini harus digunakan, dan saya mendapatkan 400 kesalahan ini jika saya lupa.

Keith
sumber
Apakah ini perlu jika ALLOWED_HOSTS = ['*']?
Mike Stoddart
1
Saya pikir ALLOWED_HOSTS memblokir seluruh host. USE_X_FORWARDED_HOST hanya menentukan apakah header HTTP digunakan.
Keith
3

Saya memiliki masalah yang sama dan saya memperbaikinya dengan menetapkan ALLOWED_HOSTS = ['*']dan untuk menyelesaikan masalah dengan gambar statis Anda harus mengubah jalur virtual dalam konfigurasi lingkungan seperti ini:

                Direktori Path Virtual

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

Saya harap ini membantu Anda.

PD: maaf untuk bahasa Inggris saya yang buruk.

Jorge
sumber
2

Saya memiliki masalah yang sama dan tidak ada jawaban yang menyelesaikan masalah saya, untuk menyelesaikan situasi seperti ini, lebih baik mengaktifkan pencatatan dengan menambahkan konfigurasi berikut untuk settings.pysementara

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

dan coba tail -f /tmp/debug.log. dan ketika Anda melihat masalah Anda, Anda bisa mengatasinya lebih mudah daripada debugging buta.

Masalah saya hampir

Header HTTP_HOST tidak valid: 'pt_web: 8000'. Nama domain yang diberikan tidak valid menurut RFC 1034/1035.

dan mengatasinya dengan menambahkan proxy_set_header Host $host;ke file konfigurasi Nginx dan mengaktifkan port forwarding oleh USE_X_FORWARDED_PORT = Truedi settings.py(itu karena dalam kasus saya saya sudah mendengarkan permintaan di Nginx pada port 8080dan meneruskannya ke gunipada port8000

Yuseferi
sumber
Terima kasih telah berbagi. Untuk kasus saya di prod, setelah saya menambahkan LOGGING = ..., maka saya melihat kesalahan "ValueError: Hilang entri manifest staticfiles untuk ... css". Kemudian saya menggunakan "python manager.py collectstatic" seperti yang disebutkan di atas oleh @ Blackeagle52, 500 error (bisa juga 400 error di dev lokal saya) diselesaikan.
zhihong
1

Bagi saya karena saya sudah xampp pada 127.0.0.1 dan Django pada 127.0.1.1 dan saya terus mencoba menambahkan host

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

dan saya mendapat kesalahan yang sama atau (400) permintaan buruk masukkan deskripsi gambar di sini

jadi saya mengubah url ke 127.0.1.1:( port yang digunakan) / proyek dan voila!

Anda harus memeriksa apa alamat jaringan virtual Anda, bagi saya karena saya menggunakan bitnami django stack 2.2.3-1 di Linux saya dapat memeriksa port django yang digunakan. jika Anda memiliki kesalahan (400 permintaan buruk) maka saya kira Django pada jaringan virtual yang berbeda .. semoga berhasil masukkan deskripsi gambar di sini

Muhamed Noaman
sumber
0

Dengan DEBUG = Falsedi file pengaturan Anda, Anda juga perlu mengatur ALLOWED_HOST daftar. Coba sertakanALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

Kalau tidak, Anda mungkin menerima kesalahan Permintaan Buruk (400) dari Django.

Abhishek Lodha
sumber
0

Cobalah untuk menjalankan server Anda dengan --insecure seperti ini:

python manage.py runserver --insecure

Alberto
sumber
0

Saya harus menghentikan server apache terlebih dahulu.

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

Itu memecahkan masalah saya selain mengedit settings.pyfile ' '

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

Ivanovic
sumber
-4

Arahkan ke pengaturan dan cari file base.py Setel host yang diizinkan ke ALLOWED_HOSTS = ['*']

Stephen Mwangi Wanjohi
sumber
4
Jangan ulangi jawaban yang diterima. Hapus ini untuk menjaga forum bersih
WoodChopper
jangan jawab seperti ini, beri komentar
Adnan Abdollah Zaki