可插入应用程序的Django默认设置约定? [英] Django default settings convention for pluggable app?

查看:38
本文介绍了可插入应用程序的Django默认设置约定?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果 settings.py 中没有定义应用程序中的默认设置,那么在应用程序中处理默认设置的 Django 方法是什么?

What's a djangonautic way of handling default settings in an app if one isn't defined in settings.py?

我目前在应用程序中放置了一个 default_settings 文件,并且我已经考虑了几个选项.我倾向于第一个选项,但在使用 globals()

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()

我经常看到应用在使用该设置的文件顶部执行 FOO = getattr(settings, 'FOO', False) 但我认为存在可读性/重复问题如果值/名称很长,请采用这种方法.

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:将设置放在函数中并迭代局部变量/设置全局变量

def setup_defaults():
    FOO = 'bar'
    for key, value in locals().items():
        globals()[key] = getattr(settings, key, value)

setup_defaults()

优点:

  • 只需写入一次 var name 即可从 django 设置中提取相同名称的默认值.

缺点:

  • 不习惯使用 globals() 并且不知道有什么影响

2:每次调用都写getattr(settings, 'MY_SETTING', default_settings.MY_SETTING)

优点:- 非常清楚.

缺点: - 重复

3:始终将设置定义为 FOO = getattr(settings, 'FOO', '...setting here...')

优点:- 默认值总是被覆盖

Pros: - Defaults are always overridden

缺点:

  • 重复(必须定义 var 两次 - 一次是字符串形式,一次是 var)
  • 设置不那么可读,因为它现在是第三个参数

4:创建实用函数以get_or_default(setting)

优点:

  • 简单
  • 不必重复设置的字符串表示

缺点:

  • 必须调用它

5:创建设置类

class Settings(object):
    FOO = 'bar'

    def __init__(self):
         # filter out the startswith('__') of 
         # self.__dict__.items() / compare to django.conf.settings?

my_settings = Settings()

缺点:

  • 不能从 foo.bar.my_settings 导入 FOO(实际上,这是一个糟糕的交易破坏者!)

我很想听听反馈.

推荐答案

我认为在您的应用程序包中创建一个 settings.py 是很常见的,您可以在其中定义如下设置:

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")

在您的应用中,您可以从应用的 settings 模块中导入它们:

In your app you can import them from your app's settings module:

from myapp.settings import *

def print_foo():
    print FOO

但我认为每个人都同意 Django 缺乏一个更好的通用架构!如果您正在寻找一种更复杂的方法来处理这个问题,有一些第三方应用程序可以解决这个问题,例如 django-appconf,但是否要为您的应用引入更多依赖则由您决定!

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!

settings.py中,将settings.*放在属性前.

from django.conf import settings
settings.FOO = getattr(settings, 'FOO', "default_value")

这篇关于可插入应用程序的Django默认设置约定?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆