2009-12-02 21 views
9

Trong Django, các cài đặt được lưu trữ trong một tệp, settings.py. Tệp này là một phần của mã và đi vào kho lưu trữ. Nó chỉ là các nhà phát triển đối phó với tập tin này. Quản trị viên giao dịch với các mô hình, dữ liệu trong cơ sở dữ liệu. Đây là dữ liệu mà các nhân viên không phát triển chỉnh sửa và khách truy cập trang web thấy được hiển thị trong các mẫu.Làm thế nào để thực hiện một số cài đặt Django có thể truy cập bởi nhân viên?

Điều này, trang web của chúng tôi và nhiều trang khác, có nhiều tùy chọn cài đặt cần được biên tập bởi các nhân viên không phải nhà phát triển. Chúng tôi đang nói về các hằng số trên toàn trang web độc lập thực sự không có chỗ trong cơ sở dữ liệu. Đặt chúng vào cơ sở dữ liệu sẽ dẫn đến nhiều truy vấn vô nghĩa. Caching có thể làm giảm bớt điều đó, nhưng điều đó có vẻ phức tạp không cần thiết để xử lý những gì có thể được thực hiện với một dòng duy nhất trong tệp settings.py.

Tôi đã thông báo this dbsettings app, nhưng nó cũ và không bị ảnh hưởng. Tôi cũng nhận thấy rằng ứng dụng thương mại điện tử django, Satchmo, bao gồm một ngã ba cụ thể sử dụng của ứng dụng dbsettings này. Chúng ta có thể xây dựng một cái gì đó tương tự vào trang web của chúng tôi, một ứng dụng lưu trữ một số cài đặt dưới dạng cặp khóa/giá trị trong một bảng cơ sở dữ liệu, nhưng nó thực sự có vẻ giống như cách tiếp cận sai. Tại sao đặt một cái gì đó trong DB mà không thuộc về chỉ để làm cho nó dễ dàng chỉnh sửa hơn bởi các nhà phát triển không?

Chúng tôi có danh sách các cài đặt trên toàn trang web trên trang web Django của chúng tôi mà chúng tôi muốn các quản trị viên không phải nhà phát triển có thể chỉnh sửa được. Cách tốt nhất để thực hiện điều này là gì?

+0

+1 vì biết điều này có thể giúp quản lý dự án Django dễ dàng hơn trong VCS. Các nhà phát triển phải cẩn thận không thực hiện các thay đổi cục bộ đối với settings.py nếu không. –

+0

bộ nhớ đệm sẽ làm giảm bớt điều này (khi cài đặt cục bộ được đưa vào cơ sở dữ liệu) chỉ với một truy vấn cho mỗi trường hợp của quá trình django. – Evgeny

+0

để khởi động lại máy chủ để tải lại cài đặt, bạn chỉ có thể gọi tệp "touch site.wsgi", ví dụ: với một công việc cron, nhưng điều này sẽ chỉ hoạt động nếu quá trình wsgi của bạn chạy ở chế độ daemon – Evgeny

Trả lời

6

Một cái gì đó như dbsettings (như bạn đã đề cập) có vẻ như là cách để đi. Từ reasons for existence cho rằng dự án:

Không phải tất cả các thiết lập thuộc về settings.py, vì nó có một số hạn chế cụ thể:

  • Cài đặt là dự án toàn. Điều này không chỉ yêu cầu các ứng dụng làm lộn xộn lên settings.py, mà còn làm tăng khả năng đặt tên xung đột.

  • Cài đặt liên tục trong suốt một phiên bản của Django. Chúng không thể được thay đổi mà không cần khởi động lại ứng dụng.

  • Cài đặt yêu cầu lập trình viên để thay đổi. Điều này đúng ngay cả nếu cài đặt không có tác động chức năng đối với bất kỳ điều gì khác.

Nếu dbsettings không làm việc cho bạn, sau đó thực hiện của riêng bạn, hoặc ngã ba nó. Dường như nó không quá gian khổ.

0

Làm thế nào về việc đưa một sitesettings.py (hoặc bất kỳ) ở đâu đó rằng các quản trị viên của bạn có thể truy cập, sau đó trong settings.py làm

from sitesettings import * 

Điều đó có vẻ tốt và đơn giản, nhưng tôi có thể đã hiểu lầm hoặc quá đơn giản hóa vấn đề của bạn :)

+1

Giải pháp này cũng không hoạt động vì chỉ những người công nghệ mới có thể chỉnh sửa tệp trên máy chủ và/hoặc khởi động lại apache. – Apreche

6

Tôi thực sự là một fan hâm mộ lớn của dbsettings, và giữ ý nghĩa để xuất bản ngã ba của tôi vá lỗi để làm việc với Django 1.1 (không thực sự là một thay đổi lớn) . Có vẻ như ai đó có số updated it already.

Tuy nhiên, có thể bạn chắc chắn rằng điều này là quá mức cần thiết cho những gì bạn cần.Một điều tôi đã làm trước đây là thêm một dòng vào cuối settings.py để nhập và phân tích một tệp YAML. YAML là một ngôn ngữ đánh dấu đơn giản, đó có ít nhất cơ bản của nó là chỉ KEY: VALUE ...

CONSTANT1: MyValue 
CONSTANT2: Anothervalue 

Nếu bạn đặt một nơi nào đó biên tập viên có thể truy cập vào nó, sau đó vào cuối settings.py bạn chỉ cần làm:

import yaml 
try: 
    globals().update(yaml.load(open('/path/to/my/yaml/file.yml'))) 
except: 
    pass 

Bạn sẽ cần thư viện Python YAML để phân tích cú pháp tệp YML.

Nhược điểm của phương pháp này là bạn sẽ cần phải khởi động lại Apache để làm cho nó nhận các thay đổi.

Chỉnh sửa để thêm Sẽ không khó để xây dựng giao diện người dùng có thể chỉnh sửa tệp này và cung cấp nút chạy script để khởi động lại Apache.

+0

Giải pháp này không hoạt động vì chỉ những người công nghệ mới có thể chỉnh sửa tệp trên máy chủ và/hoặc khởi động lại apache. – Apreche

+0

Sẽ không khó để xây dựng giao diện người dùng có thể chỉnh sửa tệp này và cung cấp nút chạy tập lệnh để khởi động lại Apache. –

+1

@Daniel - mặc dù tại thời điểm đó bạn đang nhận được vào cùng một loại công việc cấp mà dbsettings yêu cầu. –

1

Nếu bạn phải tránh khởi động lại máy chủ thì nơi hợp lý cho cài đặt là cơ sở dữ liệu như Dominic và Daniel cho biết, nhưng bạn sẽ cần phải vô hiệu hóa đối tượng cài đặt được lưu trong bộ nhớ cache mỗi khi được cập nhật.

Có vẻ như có thể đặt lại giá trị trong bộ nhớ cache với số low level cache API của Django. Tất cả những gì bạn muốn có thể đạt được với các cuộc gọi này:

cache.set('settings', local_settings) 
cache.add('settings', local_settings) 
local_settings = cache.get('settings') 
cache.delete('settings') 
Các vấn đề liên quan