跳转到主要内容

使用类来定义设置。

项目描述

此项目允许您使用类而不是模块来定义Django项目的设置。除此之外,这还允许您使用继承和计算属性。

https://secure.travis-ci.org/matthewwithanm/django-classbasedsettings.png?branch=develop

安装

安装的最简单方法是使用pip

pip install django-classbasedsettings

但是,您也可以直接将“cbsettings”文件夹放入您的pythonpath中。

设置

您当前设置DJANGO_SETTINGS_MODULE的地方,您需要调用cbsettings.configure。因此,您的manage.py将看起来像这样

#!/usr/bin/env python
import os
import sys
import cbsettings

if __name__ == "__main__":
    os.environ.setdefault('DJANGO_SETTINGS_FACTORY', 'path.to.MySettings')
    cbsettings.configure()

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

您需要对您的wsgi文件进行类似的修改

import os
import cbsettings
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_FACTORY', 'path.to.MySettings')
cbsettings.configure()

application = get_wsgi_application()

用法

基本

您需要修改的settings.py文件,Django为您创建的,是将所有变量嵌套在一个类中

from cbsettings import DjangoDefaults

class MySettings(DjangoDefaults):

    ADMINS = (
        # ('Your Name', 'your_email@example.com'),
    )

    MANAGERS = ADMINS

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.',
            'NAME': '',
            'USER': '',
            'PASSWORD': '',
            'HOST': '',
            'PORT': '',
        }
    }

    # etc, etc

请注意,该类继承自 DjangoDefaults。通过继承此类,您将获得Django通常与您的设置组合的所有默认设置值。(这些是从 django.conf.global_settings 中提取的,因此它们将与您的Django版本保持一致,而不是基于类设置。)您还可以执行类似这样的操作

class MySettings(DjangoDefaults):

    STATICFILES_FINDERS = DjangoDefaults.STATICFILES_FINDERS + (
        'my.custom.StaticFileFinder',
    )

    # etc

这些只是普通的Python类,所以您可以执行您通常可以执行的所有操作

class MySettings(DjangoDefaults):

    @property
    def TEMPLATE_DEBUG(self):
        # Now a subclass can override DEBUG and TEMPLATE_DEBUG will be changed accordingly
        return self.DEBUG

    # etc

可调用属性会自动调用

class MySettings(DjangoDefaults):

    TEMPLATE_DEBUG = lambda s: s.DEBUG

……除非您不想它们被调用

from cbsettings import callable_setting

class MySettings(DjangoDefaults):

    @callable_setting
    def SOME_SETTING(self, *args, **kwargs):
        # This setting is actually a callable. The decorator tells cbsettings
        # not to invoke it to get a settings value.
        .
        .
        .

    # You can also use the decorator with functions defined elsewhere
    SOME_OTHER_SETTING = callable_setting(my_function)

您还可以阻止您的可调用设置接收“self”参数

from cbsettings import callable_setting

class MySettings(DjangoDefaults):

    @callable_setting(takes_self=False)
    def SOME_SETTING(*args, **kwargs):
        .
        .
        .

    SOME_OTHER_SETTING = callable_setting(takes_self=False)(my_function)

按应用混合

提供了两个类,以节省您输入长设置名称的时间:PrefixedSettingsAppsettings。这些用于声明具有前缀的设置子集。然后可以将这些类混合到您的实际设置类中。

PrefixedSettings 将应用一个任意前缀,这可以通过元类提供。如果没有指定,它将从类名中提取前缀

from cbsettings import PrefixedSettings

class MyFancySettings(PrefixedSettings):
    VALUE = 5

这将导致名为 MY_FANCY_VALUE 的设置。(如果您将类命名为 MyFancy——不带有“Settings”后缀,您将得到相同的结果。)如果指定了前缀,它将直接使用,不进行任何操作。换句话说

class MyFancySettings(PrefixedSettings):
    VALUE = 5

    class Meta:
        prefix = 'hello'

将导致名为 helloVALUE 的设置。

AppSettings 类似,但它使用不同的Meta属性并进行了一些额外的格式化。在大多数情况下,您希望使用 AppSettings 而不是 PrefixedSettings

from cbsettings import AppSettings

class MyAppSettings(AppSettings):
    VALUE = 5

将导致名为 MY_APP_VALUE 的设置。(如果您将类命名为 MyApp——不带有“Settings”后缀,您将得到相同的结果。)如果明确提供了应用程序名称,它将被转换为大写,并在末尾添加下划线

class MyAppSettings(AppSettings):
    VALUE = 5

    class Meta:
        app_name = 'somebody_elses_app'

将导致名为 SOMEBODY_ELSES_APP_VALUE 的设置。

使用设置工厂

您可能认为将设置类硬编码到文件中与Django硬编码设置模块一样糟糕。这是真的。这就是为什么 configure() 可以传递任何可调用的路径,该可调用返回设置对象实例。因此,您的 manage.py 可能看起来像这样

#!/usr/bin/env python
import sys
import cbsettings

if __name__ == "__main__":
    cbsettings.configure('path.to.my.settings.factory')

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

然后在 path/to/my/settings.py

def factory():
    if 'DEV' in os.environ:
        return MyDebugSettings()
    else:
        return MyProductionSettings()

现在您可以根据任何条件轻松更改正在使用的设置类,而无需修改多个文件。

使用开关器

使用工厂方法来确定要使用的设置类是一个强大的功能!但通常您将根据相同类型的条件切换设置类,所以 django-classbasedsettings 提供了一个工厂来处理这些常见情况,并允许您轻松定义自己的简单条件。它还使用更声明性的语法,这使得它比工厂方法更有组织性。以下是如何在设置文件中使用它的示例

from cbsettings import DjangoDefaults, switcher

class MyProductionSettings(DjangoDefaults):
    DEBUG = False
    # etc

class MyDevSettings(DjangoDefaults):
    DEBUG = True
    # etc

class MyTestingSettings(MyProductionSettings):
    SOME_VAR = 'whatever'

# You can use one of the preregistered conditions by passing kwargs. The
# first class whose conditions are all met will be used.
switcher.register(MyTestSettings, testing=True)
switcher.register(MyDevSettings, hostnames=['mycompuer.home', 'billscomputer.home'])
switcher.register(MyProductionSettings, hostnames=['theserver.com'])

# ...or you can define your own simple checks as positional arguments. If
# all of the values are truthy (and any kwarg checks pass), the class will
# be used.
switcher.register(MyDevSettings, 'dev.mysite.com' in __file__)
switcher.register(MyDevSettings, os.environ.get('DEV'))

# Callable positional arguments will be called, then checked for truthiness.
switcher.register(MyDevSettings, lambda: randint(1, 2) == 2)

您还可以将 switcher.register 作为类装饰器使用

@switcher.register(hostnames=['theserver.com'])
class MyProductionSettings(DjangoDefaults):
    DEBUG = False
    # etc

然后,在您调用 configure 的任何地方,传递它您的模块的 switcher 变量

cbsettings.configure('path.to.my.settings.switcher')

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

django-classbasedsettings-1.5.0.tar.gz (10.5 kB 查看哈希值)

上传时间 源代码

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面