2015-08-21 14 views
5

Chúng tôi đang cập nhật ứng dụng của mình từ Django 1.6 lên 1.7.Làm thế nào để lọc Khử haoWarnings xảy ra trong quá trình nhập?

Chúng tôi thấy nhiều thông báo sau: RemovedInDjango18Warning

Có cách nào để lọc chúng không? Chúng được phát ra trong quá trình nhập.

Chúng tôi đã thử warnings.filterwarnings('ignore', '...') nhưng cảnh báo được phát ra trước khi chúng tôi gọi warnings.filterwarnings().

Làm cách nào để lọc các cảnh báo này xảy ra trong quá trình nhập?

+0

@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

+0

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

+0

@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

Trả lời

4

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.

Các vấn đề liên quan