QuickFix
Để tắt nó chỉ khi bạn chạy manage.py
, thêm những dòng sau import sys
:
# ...
import sys
if not sys.warnoptions:
sys.warnoptions += [None]
# ...
Nếu bạn cũng muốn im lặng nó từ máy chủ WSGI của bạn (ví dụ Apache), cập nhật your_project/wsgi.py
và thêm các dòng sau sau import os
:
# ...
import os
import sys
if not sys.warnoptions:
sys.warnoptions += [None]
# ...
Giải thích
Lý do làm việc này là vì cách django.utils.log.configure_logging()
xử lý nó:
def configure_logging(logging_config, logging_settings):
if not sys.warnoptions:
# Route warnings through python logging
logging.captureWarnings(True)
# RemovedInNextVersionWarning is a subclass of DeprecationWarning which
# is hidden by default, hence we force the "default" behavior
warnings.simplefilter("default", RemovedInNextVersionWarning)
# ...
Nó cố tình gọi sớm trong quá trình khởi động như là một phần của django.setup()
, điều này giải thích tại sao lỗi được phát ra trước khi bạn có thể im lặng họ tiếp tục xuống ngăn xếp.
Thêm phần tử mới vào sys.warnoptions
buộc nó để đánh giá True
, bỏ qua logic. Điều này là vô hại vì nó là only used during python startup khi được tải bởi mô-đun warnings
.
RemovedInNextVersionWarning
chỉ là bí danh cho RemovedInDjango18Warning
in Django 1.7. Nó được đặt thành RemovedInDjango19Warning
in 1.8, v.v. cho các phiên bản sau - mã này phải là bằng chứng trong tương lai cho loại DeprecationWarning
này.
phương pháp dòng lệnh
Lưu ý rằng sys.warnoptions
thường được thiết lập trong quá trình khởi động python dựa trên -W
argument khi gọi python. Vì vậy, một cách đơn giản để chỉ im lặng các cảnh báo khi bạn sử dụng máy chủ dev là python -W123 manage.py runserver
. Điều này không yêu cầu phải sửa đổi các tệp nhưng kết quả là một cảnh báo vô hại khi khởi động vì 123
chỉ là một trình giữ chỗ chứ không phải là một hành động cảnh báo hợp lệ.
Một cách khác là python -Wi::DeprecationWarning manage.py runserver
, mặc dù điều này sẽ bỏ qua ALLDeprecationWarning
s, trong đó có khả năng những người quan tâm không phải là RemovedInDjango18Warning
.
@Andy. Tôi nghĩ đây là một câu hỏi khác. Tôi biết cách sử dụng 'warnings.filterwarnings()'. Vấn đề của tôi là thời gian: Rất nhiều tin nhắn được phát ra trong quá trình nhập. Tôi không biết cách gọi warnings.filterwarnings() đủ sớm – guettli
Còn về [viết bộ lọc của riêng bạn] (https://docs.djangoproject.com/en/1.8/topics/logging/# id5) trong settings.py? – danihp
@danhip AFAIK cảnh báo được phát ra trước khi settings.py được tải. Một bộ lọc trong settings.py sẽ là quá muộn. – guettli