为您的Django包、可重用应用或框架添加特定应用设置的一致、用户友好的解决方案。
项目描述
什么是django-cogwheels?
django-cogwheels 的目标是创建一种标准化、经过充分测试的方法,允许应用用户通过覆盖项目Django设置中的内容来覆盖默认行为。
还有其他应用试图解决这个问题,但对我而言,创建一个能够很好地处理设置弃用(这是我发现自己经常在维护的应用中需要做的事情)的解决方案非常重要。对我来说,创建一个
非常容易设置
正确考虑不同受众(“应用开发者”和“应用用户”)
对于100个应用和5个应用都同样适用
只有在绝对必要时才会使事情复杂化
给您的用户提供他们应得的灵活性,并允许他们
覆盖基本Python类型值,例如:字符串、整数、布尔值、十进制和浮点数。
覆盖结构化Python类型值,例如:列表、元组和字典。
使用您提供的自定义Django模型。
使用您提供的自定义Python类、对象或整个模块。
对应用开发者大有裨益!
实现可覆盖的应用特定设置的稳定、文档化、标准化方法。
明确定义和传达应用程序设置废弃状态,为您在项目生命周期内提供灵活地重命名、替换或标记设置以进行删除的能力。使用旧设置名称定义的用户覆盖仍然可用,使您能够在废弃期间继续支持它们。
当为模型、模块或其他可覆盖对象设置提供默认值无效时,会显示有用且一致的错误信息。
为模型、模块和其他可导入的Python对象缓存导入,以实现快速访问。
与Django的测试框架良好兼容(订阅Django的setting_changed信号,因此当使用override_settings时,会清除缓存值)。
对应用程序用户大有裨益!
当他们的模型、类、方法或模块覆盖设置格式不正确或无法导入时,会显示有用且一致的错误信息。
当它们覆盖已被重命名、替换或标记为删除的设置时,会显示有用且一致的废弃警告。
快速入门指南
使用pip安装此包
pip install django-cogwheels
进入项目根应用程序目录
cd your-django-project/yourproject/
使用cogwheels Django应用程序模板创建一个conf应用程序
django-admin.py startapp conf --template=https://github.com/ababic/cogwheels-conf-app/zipball/master
打开yourproject/conf/defaults.py,并按如下方式添加您的设置值
# You can add settings for any type of value MAX_ITEMS_PER_ORDER = 5 # For settings that refer to models, use a string in the format 'app_name.Model' ORDER_ITEM_MODEL = 'yourproject.SimpleOrderItem' # For settings that refer to a python module, use an 'import path' string, like so: DISCOUNTS_BACKEND = 'yourproject.discount_backends.simple' # For settings that refer to classes, methods, or other python objects from a # python module, use an 'object import path' string, like so: ORDER_FORM_CLASS = 'yourproject.forms.OrderForm'
要在您的应用程序中使用设置值,只需导入设置辅助工具,并将相关设置作为属性引用,如下所示
>>> from yourproject.conf import settings >>> settings.MAX_ITEMS_PER_ORDER 5 >>> settings.ORDER_ITEM_MODEL 'yourproject.SimpleOrderItem' >>> settings.DISCOUNTS_BACKEND 'yourproject.discount_backends.simple' >>> settings.ORDER_FORM_CLASS 'yourproject.forms.OrderForm'
对于引用Django模型的设置,您可以使用设置辅助工具的特殊models属性来访问模型类本身,而不仅仅是字符串值。例如
>>> from yourproject.conf import settings >>> model = settings.models.ORDER_ITEM_MODEL yourproject.models.SimpleOrderItem >>> obj = model(id=1, product='test product', quantity=15) >>> obj.save() >>> print(model.objects.all()) <QuerySet [<SimpleOrderItem: SimpleOrderItem object (1)>]>
幕后,Django的django.apps.apps.get_model()方法被调用,并且结果被缓存,以便快速有效地处理对相同模型的重复请求。
对于引用Python模块的设置,您可以使用设置辅助工具的特殊modules属性来访问模块本身,而不是导入路径字符串
>>> from yourproject.conf import settings >>> module = settings.modules.DISCOUNTS_BACKEND <module 'yourproject.discount_backends.simple' from '/system/path/to/your-django-project/yourproject/discount_backends/simple.py'>
幕后,Python的importlib.import_module()方法被调用,并且结果被缓存,以便快速有效地处理对相同模块的重复请求。
对于引用类、函数或其他可导入的Python对象的设置,您可以使用设置辅助工具的特殊objects属性来访问这些对象,而不是导入路径字符串
>>> from yourproject.conf import settings >>> form_class = settings.objects.ORDER_FORM_CLASS yourproject.formsOrderForm >>> form = form_class(data={}) >>> form.is_valid() False
幕后,Python的importlib.import_module()方法被调用,并且结果被缓存,以便快速有效地处理对相同对象的重复请求。
您的应用程序的用户现在可以通过向他们的Django设置模块添加替代值来覆盖任何默认值。例如
# userproject/settings/base.py YOURAPP_MAX_ITEMS_PER_ORDER = 2 YOURAPP_ORDER_ITEM_MODEL = 'userproject_orders.CustomOrderItem' YOURAPP_DISCOUNTS_BACKEND = 'userproject.discounts.custom_discount_backend' YOURAPP_ORDER_FORM_CLASS = 'userproject.orders.forms.CustomOrderForm'
您可能会注意到上述变量名称都以前缀YOURAPP_开头。这个前缀将根据包名称而有所不同。
这种设置命名空间化很重要。这不仅帮助您的应用程序用户记住他们的覆盖设置是为哪个应用程序设置的,而且还帮助防止应用程序之间设置名称冲突。
您可以通过执行以下操作来找出您应用程序的前缀
>>> from yourproject.conf import settings >>> settings.get_prefix() 'YOURPROJECT_'
您可以通过在设置辅助工具类上设置prefix属性来将此前缀更改为您想要的任何内容
# yourapp/conf/settings.py class MyAppSettingsHelper(BaseAppSettingsHelper): prefix = 'CUSTOM' # No need for a trailing underscore here
>>> from yourproject.conf import settings >>> settings.get_prefix() 'CUSTOM_'
常见问题解答
1. 我可以查看任何django-cogwheels的示例实现吗?
当然可以。
wagtailmenus使用cogwheels来管理它的应用程序设置。请参阅:[https://github.com/rkhleics/wagtailmenus/tree/master/wagtailmenus](https://github.com/rkhleics/wagtailmenus/tree/master/wagtailmenus)
您还可以检查 cogwheels 本身内的 tests 应用程序,其中包含许多示例:[https://github.com/ababic/django-cogwheels/tree/master/cogwheels/tests](https://github.com/ababic/django-cogwheels/tree/master/cogwheels/tests)
2. defaults.py 和 settings.py 是否必须位于 conf 应用程序中?
不是的。这只是一种建议。每个人对如何组织项目都有自己的偏好,这很好。只要您将 defaults.py 和 settings.py 放在同一目录下,事情应该可以顺利运行。
如果您想将 defaults.py 和 settings.py 放在不同的位置,cogwheels 也支持这一点。但是,您需要设置设置辅助类上的 defaults_path 属性,以便它知道默认值的位置。例如
# yourapp/some_directory/settings.py
class MyAppSettingsHelper(BaseAppSettingsHelper):
defaults_path = 'yourapp.some_other_place.defaults'
3. 您提到了对设置弃用的支持。它是如何工作的?
更完整的文档将很快添加。在此期间,如果您对弃用定义的样子感兴趣,您可能想查看 tests 应用程序的设置辅助定义:[https://github.com/ababic/django-cogwheels/blob/master/cogwheels/tests/conf/settings.py](https://github.com/ababic/django-cogwheels/blob/master/cogwheels/tests/conf/settings.py)
4. 如何指定某些设置的验证规则?
cogwheels 执行的唯一验证是对那些打算引用 Django 模型和其他可导入项的设置值,并且仅在您在代码中使用 settings.models.SETTING_NAME、settings.modules.SETTING_NAME 或 settings.objects.SETTING_NAME 来导入和访问对象时触发此验证。
目前还没有办法配置 ``cogwheels`` 来对其他设置值应用验证。
我确实打算在未来的版本中支持此类功能,但我无法保证具体的时间。
如果您因此感到沮丧,请记住,开发人员故意使用不合适的覆盖值来设置设置对任何人都没有好处。只要您的文档足够详细地说明了预期值的规则/边界,问题应该非常罕见。
5. settings.py 中的最后一行是什么意思?
Ahh,是的。那 sys.modules[__name__] = MyAppSettingsHelper() 部分。我必须承认,我对此也犹豫了一段时间。
我同意这种代码使用“不常见”。也许因为它在许多情况下并不特别有用,或者也许因为使用这些功能不当可能会以奇怪且难以调试的方式破坏事物。但,对这种黑客技术的支持不会消失,在 cogwheels 的情况下,它是很有用的,因为它消除了在 __init__.py(我有许多原因不喜欢它)中实例化事物的需要。
如果您仍然不放心,也许 Guido van Rossum(Python 的创始人)可以让您安心?[https://mail.python.org/pipermail/python-ideas/2012-May/014969.html](https://mail.python.org/pipermail/python-ideas/2012-May/014969.html)
兼容性
当前版本经过测试,与以下版本兼容
Django 版本 1.11 至 2.2
Python 版本 3.4 至 3.8
项目详情
下载文件
下载适用于您平台文件的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。