可插拔应用程序的Django默认设置约定? [英] Django default settings convention for pluggable app?
问题描述
如果在 settings.py
中未定义应用程序中的默认设置,djangonautic的方式是什么?
我目前在应用中放置了一个 default_settings
文件,我已经考虑过几个选项。我倾向于第一个选择,但可能存在使用 globals()
时不知道的陷阱我主要看到应用程序在使用该设置的文件顶部执行一个
FOO = getattr(设置,FOO,False)
,但我认为如果值/名称长,则可以使用此方法的可读性/重复性问题。 1:将设置置于一个函数并迭代本地/全局变量
def setup_defaults():
FOO ='bar '
为key,value在本地()。items():
全局变量()[key] = getattr(设置,键值)
setup_defaults()
优点:
- 只需要编写var名称一次,以从django设置中拖动相同的名称。
缺点:
- 不习惯使用全局变量(),不知道任何含义
2:写入 getattr(设置,'MY_SETTING',default_settings.MY_SETTING)
每个电话
优点:$ b $ b - 很清楚。
缺点: - 重复
3:始终将设置定义为 FOO = getattr(settings, FOO','...设置在这里...')
优点:$ b $ b - 默认值总是覆盖
缺点:
- 重复(必须定义var两次 - 一次在字符串中表单,一次在var)
- 设置不可读,因为现在是第三个参数
4:创建效用函数到 get_or_default(设置)
优点:
- 简单
- 不必重复字符串
缺点:
- 必须调用它
5:创建设置类
类设置(对象):
FOO ='bar'
def __init __(self):
#过滤掉startswith('__ ')
#self .__ dict __。items()/与django.conf.settings比较?
my_settings =设置()
缺点:
- 无法从foo.bar.my_settings导入FOO(实际上,这是一个可怕的交易破解者!)
我很乐意收到反馈。
我认为创建一个 settings.py
是很常见的您的应用程序的软件包,您可以在其中定义如下设置:
从django.conf导入设置
FOO = getattr设置FOO,default_value)
在您的应用程序中,您可以从应用程序的设置
模块:
from myapp.settings import *
def print_foo():
打印FOO
但是我想大家都同意Django缺少一个更好的通用架构为此!如果您正在寻找更为复杂的方法来处理此问题,则会出现一些第三方应用程序,例如 django- appconf ,但如果您想为您的应用程序再引入一个依赖关系,那么您的决定是不可以的!
What's a djangonautic way of handling default settings in an app if one isn't defined in settings.py
?
I've currently placed a default_settings
file in the app and I've considered a few options. I'm leaning towards the first option, but there may be pitfalls I'm not aware of in using globals()
I've mostly seen apps do a FOO = getattr(settings, 'FOO', False)
at the top of the file that uses the setting but I think there are readability/repetition problems with this approach if the values / names are long.
1: Place settings in a function and iterate over locals / set globals
def setup_defaults():
FOO = 'bar'
for key, value in locals().items():
globals()[key] = getattr(settings, key, value)
setup_defaults()
Pros:
- Only have to write var name once to pull default of same name from django settings.
Cons:
- Not used to using globals() and don't know of any implications
2: Write getattr(settings, 'MY_SETTING', default_settings.MY_SETTING)
every call
Pros: - Very clear.
Cons: - Repetitive
3: Always define settings as FOO = getattr(settings, 'FOO', '...setting here...')
Pros: - Defaults are always overridden
Cons:
- Repetitive (must define var twice - once in string form, once in var)
- Setting is not as readable since it's now the third argument
4: Create utility function to get_or_default(setting)
Pros:
- Simple
- Don't have to repeat string representation of setting
Cons:
- Have to call it
5: Create a settings class
class Settings(object):
FOO = 'bar'
def __init__(self):
# filter out the startswith('__') of
# self.__dict__.items() / compare to django.conf.settings?
my_settings = Settings()
Cons:
- Can't do from foo.bar.my_settings import FOO (actually, that's a terrible deal breaker!)
I'd love to hear feedback.
I think it's quite common to create a settings.py
in your app's package, where you define your settings like this:
from django.conf import settings
FOO = getattr(settings, 'FOO', "default_value")
In your app you can import them from your app's settings
module:
from myapp.settings import *
def print_foo():
print FOO
But I think everybody agrees that Django is lacking a better generic architecture for this! If you're looking for a more sophisticated way to handle this, there are some third party apps for this like django-appconf, but it's your decision if you want to introduce one more dependency for your app or not!
这篇关于可插拔应用程序的Django默认设置约定?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!