使用类来定义设置。
项目描述
此项目允许您使用类而不是模块来定义Django项目的设置。除此之外,这还允许您使用继承和计算属性。
安装
安装的最简单方法是使用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)
按应用混合
提供了两个类,以节省您输入长设置名称的时间:PrefixedSettings 和 Appsettings。这些用于声明具有前缀的设置子集。然后可以将这些类混合到您的实际设置类中。
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c85708a85614c671e81d75e8781691c0e69a173ea6d25e54b366d6004dd8c5ee |
|
MD5 | 1350d904a5757d25453d6ee48353ea12 |
|
BLAKE2b-256 | 0a74fc3277e99781cdf624f1aaaf7c6c2ac2a6c82618a1c75b2ad1b0c2e8ba14 |