python - 可插拔应用程序的Django默认设置约定?

标签 python django configuration

如果 settings.py 中未定义默认设置,那么在应用程序中处理默认设置的 djangonautic 方式是什么?

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

时可能存在我不知道的陷阱

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


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...')

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

缺点:

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

4:为get_or_default(setting)

创建实用函数

优点:

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

缺点:

  • 必须调用它

5:创 build 置类

class Settings(object):
    FOO = 'bar'

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

my_settings = Settings()

缺点:

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

我很想听听反馈。

最佳答案

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

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

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

from myapp.settings import *

def print_foo():
    print FOO

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

2020 年更新

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

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

关于python - 可插拔应用程序的Django默认设置约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8428556/

相关文章:

javascript - 在 Webpack 4 中创建 Node 库

C# WCF 服务在重新连接后重新发送数据?这是什么属性?

python - Odoo 9.0 使用 python xml-rpc 创建产品变体

python - 使用 allauth 登录时生成 jwt

python - 如何在 Django 中为答案投票?

python - Django 表单集 can_delete header

groovy - 如何将 Email-Ext groovy 脚本放置在 jenkins 文件系统上

python - 将包含特定字符串的行值移动到 Python 中的新列

python - 将最后 X 列值求和到新列中

python - 原始浮点编码