Django đưa ra yêu cầu xấu (400) khi DEBUG = Sai


254

Tôi mới dùng django-1.6. Khi tôi chạy máy chủ django DEBUG = True, nó chạy hoàn hảo. Nhưng khi tôi thay đổi DEBUGthành Falsetrong tệp cài đặt thì máy chủ dừng lại và nó báo lỗi sau trên dấu nhắc lệnh:

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

Sau khi tôi đổi ALLOWED_HOSTSthành ["http://127.0.0.1:8000",], trong trình duyệt tôi gặp lỗi:

Bad Request (400)

Có thể chạy Django mà không cần chế độ gỡ lỗi?


Một điều cần nhớ: không thêm 'http' hoặc 'https' vàoALLOWED_HOSTS
shellbye

Câu trả lời:


415

Các ALLOWED_HOSTSdanh sách nên chứa đầy đủ tên máy chủ , không url. Rời khỏi cổng và giao thức. Nếu bạn đang sử dụng 127.0.0.1, tôi cũng sẽ thêm localhostvào danh sách:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Bạn cũng có thể sử dụng *để khớp với bất kỳ máy chủ nào :

ALLOWED_HOSTS = ['*']

Trích dẫn tài liệu:

Các giá trị trong danh sách này có thể là các tên đủ điều kiện (ví dụ 'www.example.com'), trong trường hợp đó chúng sẽ được khớp chính xác với tiêu đề của yêu cầuHost (không phân biệt chữ hoa chữ thường, không bao gồm cổng ). Một giá trị bắt đầu với một khoảng thời gian có thể được sử dụng như một ký tự đại diện tên miền phụ: '.example.com'sẽ phù hợp example.com, www.example.comvà bất kỳ tên miền phụ khác example.com. Một giá trị của '*'ý chí sẽ phù hợp với bất cứ điều gì; trong trường hợp này, bạn có trách nhiệm cung cấp xác thực Hosttiêu đề của riêng bạn (có lẽ trong phần mềm trung gian; nếu vậy phần mềm trung gian này phải được liệt kê đầu tiên trong MIDDLEWARE_CLASSES).

Nhấn mạnh đậm của tôi .

Trạng thái 400 phản hồi bạn nhận được là do một SuspiciousOperationngoại lệ được đưa ra khi tiêu đề máy chủ của bạn không khớp với bất kỳ giá trị nào trong danh sách đó.


3
Cảm ơn nó hoạt động, nhưng khi tôi đặt Sai, một vấn đề xuất hiện, đối với tất cả các tệp tĩnh được hiển thị là 404. Tôi không thể hiểu tại sao nó không được tìm thấy
MegaBytes

@MegaBytes: xin lỗi, tôi không biết đó có thể là gì.
Martijn Pieters

1
Bạn có thể gợi ý cho tôi cách thực hiện không, vì dự án của tôi đang được sản xuất.
MegaBytes

Một lần nữa, tôi không có ý tưởng ngay cả những gì bạn đang thiết lập False. Có lẽ bạn có thể đăng một câu hỏi mới?
Martijn Pieters

9
@MegaBytes Khi DEBUG là Sai, tất cả các tệp tĩnh được cung cấp từ STATIC_ROOT, do đó, thực tế là ./manage.py collectstaticsẽ làm.
Blackeagle52

6

Đối với tôi, tôi đã nhận được lỗi này bằng cách không đặt USE_X_FORWARDED_HOSTthành đúng. Từ các tài liệu:

Điều này chỉ nên được kích hoạt nếu một proxy đặt tiêu đề này được sử dụng.

Dịch vụ lưu trữ của tôi đã viết rõ ràng trong tài liệu của họ rằng cài đặt này phải được sử dụng và tôi gặp lỗi 400 này nếu tôi quên nó.


Điều này có cần thiết không nếu ALLOWED_HOSTS = ['*']?
Mike Stoddart

1
Tôi nghĩ ALLOWED_HOSTS chặn toàn bộ máy chủ. USE_X_FORWARDED_HOST chỉ xác định nếu tiêu đề HTTP được sử dụng.
Keith

3

Tôi đã có cùng một vấn đề và tôi đã khắc phục nó bằng cách thiết lập ALLOWED_HOSTS = ['*']và để giải quyết vấn đề với các hình ảnh tĩnh, bạn phải thay đổi các đường dẫn ảo trong cấu hình môi trường như thế này:

                Thư mục đường dẫn ảo

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

Tôi hy vọng nó sẽ giúp bạn.

PD: xin lỗi vì tiếng anh không tốt của tôi


2

Tôi có cùng một vấn đề và không có câu trả lời nào giải quyết được vấn đề của tôi, vì giải quyết tình huống như thế này tốt hơn là cho phép đăng nhập bằng cách thêm cấu hình sau vào settings.pytạm thời

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

và cố gắng tail -f /tmp/debug.log. và khi bạn thấy vấn đề của mình, bạn có thể xử lý dễ dàng hơn nhiều so với gỡ lỗi mù.

Vấn đề của tôi là về

Tiêu đề HTTP_HOST không hợp lệ: 'pt_web: 8000'. Tên miền được cung cấp không hợp lệ theo RFC 1034/1035.

và giải quyết nó bằng cách thêm proxy_set_header Host $host;vào tập tin cấu hình Nginx và tạo điều kiện cho cổng chuyển tiếp bởi USE_X_FORWARDED_PORT = Truetrong settings.py(đó là vì trong trường hợp của tôi, tôi đã nghe theo yêu cầu trong Nginx trên cổng 8080và vượt qua nó để gunitrên cổng8000


Cám ơn vì đã chia sẻ. Đối với trường hợp của tôi trong prod, sau khi tôi thêm LOGGING = ..., thì tôi thấy lỗi "ValueError: Thiếu mục nhập tệp kê khai staticfiles cho ... css". Sau đó, tôi sử dụng "python manager.py collstatic" như đã đề cập ở trên bởi @ Blackeagle52, lỗi 500 (cũng có thể là 400 lỗi trong dev cục bộ của tôi) đã được giải quyết.
zhihong

1

Đối với tôi vì tôi đã xampp trên 127.0.0.1 và django trên 127.0.1.1 và tôi tiếp tục thử thêm máy chủ

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

và tôi đã nhận được cùng một lỗi hoặc (400) yêu cầu xấu nhập mô tả hình ảnh ở đây

vì vậy tôi thay đổi url thành 127.0.1.1:( cổng đã sử dụng) / dự án và voila!

bạn phải kiểm tra địa chỉ mạng ảo của bạn là gì, đối với tôi khi tôi sử dụng bitnami django stack 2.2.3-1 trên Linux tôi có thể kiểm tra cổng django nào đang sử dụng. Nếu bạn gặp lỗi (400 yêu cầu xấu) thì tôi đoán django trên các mạng ảo khác nhau .. chúc may mắn nhập mô tả hình ảnh ở đây


0

Với DEBUG = Falsetệp cài đặt trong bạn, bạn cũng cần thiết lập danh sách ALLOWED_HOST. Hãy thử bao gồmALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

Nếu không, bạn có thể nhận được lỗi Yêu cầu xấu (400) từ django.


0

Hãy thử chạy máy chủ của bạn với --insecure như thế này:

python Manage.txt ranerver - bảo mật


0

Tôi đã phải dừng máy chủ apache trước.

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

Điều đó đã giải quyết vấn đề của tôi ngoài việc chỉnh sửa settings.pytệp ''

đến ALLOWED_HOSTS = ['se.rv.er.ip', 'www.example.com']


-4

Điều hướng đến cài đặt và xác định vị trí tệp cơ sở Đặt các máy chủ được phép thành ALLOWED_HOSTS = ['*']


4
Đừng lặp lại câu trả lời được chấp nhận. Xóa cái này để giữ sạch diễn đàn
WoodChopper

đừng trả lời như thế này, hãy bình luận nó
Adnan Abdollah Zaki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.