2012-06-28 15 views

Trả lời

7

Kiểm tra this section kiểu mã hóa Django. Lý do được giải thích trong đó (được trích dẫn bên dưới).

Ngoài hiệu suất, mô-đun bên thứ ba có thể sửa đổi cài đặt khi chúng được nhập. Việc truy cập cài đặt sẽ bị trì hoãn để đảm bảo cấu hình này xảy ra trước tiên.

Modules không nên trong cài đặt sử dụng chung được lưu trữ trong django.conf.settings ở cấp cao nhất (ví dụ: đánh giá khi các mô-đun được nhập khẩu). Lời giải thích cho điều này là như sau:

cấu hình bằng tay các thiết lập (tức là không phụ thuộc vào biến môi trường DJANGO_SETTINGS_MODULE) được phép và có thể như sau:

from django.conf import settings 

settings.configure ({}, SOME_SETTING = 'foo') Tuy nhiên, nếu có bất kỳ cài đặt nào được truy cập trước khi cài đặt cấu hình , điều này sẽ không hoạt động. (Nội bộ, cài đặt là LazyObject tự cấu hình chính nó khi cài đặt được truy cập nếu cài đặt chưa được được định cấu hình).

Vì vậy, nếu có một mô-đun có chứa một số mã như sau:

from django.conf import settings 
from django.core.urlresolvers import get_callable 

default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW) 

... sau đó nhập khẩu module này sẽ gây ra các thiết lập đối tượng được cấu hình. Điều đó có nghĩa là khả năng bên thứ ba nhập mô-đun ở mức cao nhất không tương thích với khả năng định cấu hình cài đặt đối tượng theo cách thủ công hoặc gây khó khăn trong một số trường hợp.

Thay vì đoạn mã trên, một mức độ của sự lười biếng hoặc gián tiếp phải được sử dụng, chẳng hạn như django.utils.functional.LazyObject, django.utils.functional.lazy() hoặc lambda.

3

Đối tượng proxy của nó tóm tắt tệp cài đặt thực tế và giảm trọng lượng nhẹ cho đến khi bạn thực sự truy cập cài đặt bạn muốn. Khi bạn bắt đầu truy cập vào các thuộc tính, nó sẽ tải theo yêu cầu. Ý tưởng là giảm chi phí trong cài đặt tải cho đến khi bạn cần chúng.

+3

Mục đích thực sự là giảm chi phí? Tôi có nghĩa là, bạn rõ ràng sẽ cần phải tải các tập tin cài đặt * cuối cùng *, tôi không thể tưởng tượng bất kỳ dự án django mà sẽ không, vì vậy nó có vẻ vô nghĩa để trì hoãn việc tải, bạn cũng có thể làm trong đầu. –

0

Tôi nghĩ rằng mục đích là đơn giản hóa cài đặt từ quan điểm của nhà phát triển. Vì vậy, mỗi dự án có thể có tập tin settings.py của riêng mình mà không cần phải xác định tất cả các cài đặt Django khác. Loại bao bọc LazySettings kết hợp mọi thứ từ Django global_settings.py và cài đặt cục bộ của bạn. Nó cho phép nhà phát triển quyết định cài đặt nào mà anh ấy muốn ghi đè, điều mà anh ấy muốn giữ các giá trị mặc định hoặc thứ mà anh ấy muốn thêm.

Lớp LazySettings có thể là tên sai cho điều này, bởi vì tôi nghĩ nó không thực sự lười biếng. Khi bạn làm điều gì đó như from django.conf import settings, toàn bộ đối tượng cài đặt nằm trong phạm vi của bạn.