2011-04-08 13 views
21

mentions Django belgeleri, kendi ayarlarınızı django.conf.settings'a ekleyebilirsiniz. Projem en settings.pyÖzel bir Django ayarı için varsayılan değer nasıl tanımlanır

APPLES = 1 

tanımlıyorsa bunu projeye uygulamalarımdaki settings.APPLES o erişebilirsiniz.

Ancak settings.py benim bu değeri tanımıyorsa, settings.APPLES erişmeye açık değil. settings.py'da açık bir ayar yoksa APPLES için varsayılan bir değer tanımlamanın bir yolu var mı?

Ayar gerektiren modül/paketteki varsayılan değeri en iyi tanımlamak isterim.

cevap

24

Uygulamalarımda ayrı bir settings.py dosyası var. Bu dosyada, settings.py dosyasında bir arama yapan bir get() işlevine sahibim ve bulunamadıysa, varsayılan değeri döndürür. Ben APPLES erişmek için gereken yere

from django.conf import settings 

def get(key, default): 
    return getattr(settings, key, default) 


APPLES = get('APPLES', 1) 

Sonra var: nitelik bulunamadı veya eğer

from myapp import settings as myapp_settings 

myapp_settings.APPLES 

Bu projelerde geçersiz kılma, getattr orada ilk kontrol ve değeri döndürecektir settings.py verir uygulama ayarları dosyanızda tanımlanan varsayılanı kullanın.

+0

Bu kırılgan değil mi? "Settings_settings.py" tarihinden önce içe aktarılan "settings.py" projesine bağlı değil mi? – Flimm

1

Mike'ın cevabından başlayarak, varsayılan ayar işlemlerini, kullanımı kolay bir arayüze sahip bir sınıfa sardım.

Yardımcısı modülü:

from django.conf import settings 

class SettingsView(object): 
    class Defaults(object): 
     pass 

    def __init__(self): 
     self.defaults = SettingsView.Defaults() 

    def __getattr__(self, name): 
     return getattr(settings, name, getattr(self.defaults, name)) 

Kullanım:

Bu django.conf.settings değeri, ya da orada ayarlı değilse varsayılan yazdırır
from localconf import SettingsView 

settings = SettingsView() 
settings.defaults.APPLES = 1 

print settings.APPLES 

. Bu settings nesnesi, tüm standart ayar değerlerine erişmek için de kullanılabilir.

+0

Uygulamaya özel ayarların, sadece daha kolay okunabilmesi için açık bir şekilde ve ana ayarlardan farklı olması gerektiğini düşünüyorum. –

1

Ayarın tanımlanıp tanımlanmadığını kontrol edip edemeyeceğinizi kontrol edebilirsiniz, eğer değilse, varsayılan değeri veriniz. Böyle

from django.conf import settings 

def setting_default(name, default_value): 
    value = getattr(settings, name, default_value) 
    setattr(settings, name, value) 

Ve sonra (belki models.py cinsinden) ayarları gerektirir app kullanmak: Örneğin: Eğer böyle bir yardımcı işlevi setting_default tanımlayabilirsiniz kullanıyor kim

setting_default('APPLES', 1) 

Bu yolu olan Uygulama özel bir şey yapmak zorunda değil.

10

Nasıl hemen: Burada

getattr(app_settings, 'SOME_SETTING', 'default value') 
+0

Bu, buradaki diğer önerilerden çok daha basittir, ancak bir ayarı/değişkeni, bir kereden fazla DRY kavramını kırmak istediğinizde, diğer çözümlerin işe yarayacağını düşünüyorsanız. Düşünce için yiyecek :) – daniel

+0

DRY nasıl bozulur? – Charlie

+0

SOME_SETTING uygulamasını uygulamanızda bir kereden fazla kullanmayı düşünüyorsanız, bunu kullandığınız her yerde bu getattr (app_settings, 'SOME_SETTING', default_value) 'yi yerleştirmeniz gerekir. – daniel

5

iki çözüm vardır. Her ikisi için uygulamalarınızda settings.py dosyalarını ayarlayabilir ve bunları varsayılan değerlerle doldurabilirsiniz. Kodunuzdaki tek bir uygulama

Kullanım from MYAPP import settings yerine from django.conf import settings için

yapılandır Varsayılan değer.

Düzenleme YOURAPP/__init__.py: Kodunuzdaki bir projenin tamamı

Kullanım from MYPROJECT import settings yerine from django.conf import settings için

from django.conf import settings as user_settings 
from . import settings as default_settings 

class AppSettings: 
    def __getattr__(self, name): 
     # If the setting you want is filled by the user, let's use it. 
     if hasattr(user_settings, name): 
      return getattr(user_settings, name) 

     # If the setting you want has a default value, let's use it. 
     if hasattr(default_settings, name): 
      return getattr(default_settings, name) 

     raise AttributeError("'Settings' object has no attribute '%s'" % name) 

settings = AppSettings() 

yapılandır varsayılan değerler.

Bu çözüm yüklemek için daha kolay görünebilir, ama iyi varsayılan değer iade edilecektir garanti etmez MYPROJECT/MYPROJECT/__init__.py

import os, sys, importlib 
from . import settings as user_settings 

def get_local_apps(): 
    """Returns the locally installed apps names""" 
    apps = [] 
    for app in user_settings.INSTALLED_APPS: 
     path = os.path.join(user_settings.BASE_DIR, app) 
     if os.path.exists(path) and app != __name__: 
      apps.append(sys.modules[app]) 
    return apps 

class AppSettings: 
    SETTINGS_MODULE = 'settings' 

    def __getattr__(self, setting_name): 

     # If the setting you want is filled by the user, let's use it. 
     if hasattr(user_settings, setting_name): 
      return getattr(user_settings, setting_name) 

     # Let's check every local app loaded by django. 
     for app in get_local_apps(): 
      module_source = os.path.join(app.__path__[0], "%s.py" % self.SETTINGS_MODULE) 
      module_binary = os.path.join(app.__path__[0], "%s.pyc" % self.SETTINGS_MODULE) 
      if os.path.exists(module_source) or os.path.exists(module_binary): 
       module = importlib.import_module("%s.%s" % (app.__name__, self.SETTINGS_MODULE)) 

       # Let's take the first default value for this setting we can find in any app 
       if hasattr(module, setting_name): 
        return getattr(module, setting_name) 

     raise AttributeError("'Settings' object has no attribute '%s'" % setting_name) 

settings = AppSettings() 

Düzen. Birkaç uygulama aynı değişkeni settings.py içinde bildirirse, hangisinin sorduğunuz varsayılan değeri döndüreceğinden emin olamazsınız.

0

Son zamanlarda aynı sorunu yaşadım ve tam olarak böyle bir durumda kullanılmak üzere tasarlanmış bir Django uygulaması oluşturdum. Belirli ayarlar için varsayılan değerleri tanımlamanızı sağlar. Daha sonra, ayarın genel ayarlar dosyasında ayarlanıp ayarlanmadığını kontrol eder. Değilse, varsayılan değeri döndürür.

Ayrıca bazı tür denetimi veya varsayılan değerin ön işleme izin için genişletilmiş ettik uygulaması bulunabilir

(örneğin noktalı sınıf yolu yük sınıfına kendisi dönüştürülebilir): https://pypi.python.org/pypi?name=django-pluggableappsettings&version=0.2.0&:action=display

İlgili konular