一个一致的、用户友好的解决方案,用于添加特定于应用程序的设置Django包、可重用的应用程序或框架。
django-cogwheels的Python项目详细描述
什么是Django齿轮?
django cogwheels的目的是创建一个标准化的、经过良好测试的方法,允许应用程序的用户通过覆盖其项目django设置中的内容来覆盖默认行为。
有其他的应用程序试图解决这个问题,但对我来说,重要的是要创建一个解决方案,以满足设置的贬损,因为这是我发现自己必须定期做的应用程序,我维护。同样重要的是,我要创造一些东西:
- 非常容易设置
- 为不同的受众(app developer和app user)提供适当的帐户。
- 对100个应用程序的设置和对5个应用程序的设置一样有效
- 只有在绝对必要时才会使事情复杂化
给予用户应有的灵活性,并允许他们:
- 重写基本的python类型值,例如:字符串、整数、布尔值、小数和浮点数。
- 重写结构化的python类型值,如:列表、元组和字典。
- 使用定制的Django型号代替您提供的型号。
- 使用自定义的python类、对象或整个模块代替您提供的类、对象或模块。
对应用程序开发者来说太好了!
- 一种稳定的、有文档记录的、标准化的方法,用于实现可覆盖的应用程序特定设置。
- 清楚地定义和传达应用程序设置的弃用状态,使您能够在项目生命周期中灵活地重命名、替换或标记要删除的设置。使用旧设置名称定义的用户覆盖对您仍然可用,允许您在折旧期间继续支持它们。
- 当为模型、模块或其他可重写对象设置提供的默认值无效时,会出现有用的、一致的错误消息。
- 缓存的导入以快速访问模型、模块和其他可导入的python对象。
- 与django的测试框架配合得很好(订阅django的 设置已更改的 信号,以便在使用 覆盖设置时清除缓存值)。
对应用程序用户来说太好了!
- 当其模型、类、方法或模块重写设置的格式不正确或无法导入时,会出现有用的、一致的错误消息。
- 当覆盖已重命名、替换或标记为要删除的设置时,会出现有用的、一致的弃用警告。
使用pip安装软件包:
pip install django-cogwheels
cd 进入项目的根应用程序目录:
cd your-django-project/yourproject/
使用cogheels django应用程序模板创建 conf 应用程序:
django-admin.py startapp conf --template=https://github.com/ababic/cogwheels-conf-app/zipball/master
打开project/conf/defaults.py并添加如下设置值:
# You can add settings for any type of valueMAX_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模型的设置,可以使用settings助手的特殊 model s 属性访问模型类本身,而不仅仅是字符串值。例如:
>>> 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)>]>
对于引用python模块的设置,可以使用设置帮助器的特殊 模块 属性访问模块本身,而不是使用导入路径字符串:
>>> 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对象的设置,可以使用设置帮助器的特殊 对象 属性访问这些对象,而不是使用导入路径字符串:
>>> 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.pyYOURAPP_MAX_ITEMS_PER_ORDER=2YOURAPP_ORDER_ITEM_MODEL='userproject_orders.CustomOrderItem'YOURAPP_DISCOUNTS_BACKEND='userproject.discounts.custom_discount_backend'YOURAPP_ORDER_FORM_CLASS='userproject.orders.forms.CustomOrderForm'
您可能会注意到,上面的变量名都以 yourapp_ 作为前缀。此前缀因应用程序而异,具体取决于软件包名称。
设置的"命名空间"很重要。它不仅可以帮助您的应用程序的用户记住其覆盖设置用于哪个应用程序,还可以帮助防止应用程序之间的设置名称冲突。
您可以通过执行以下操作来了解应用程序的前缀:
pip install django-cogwheels
0通过在settings helper类上设置 前缀 属性,您可以将此前缀更改为您喜欢的任何内容,如下所示:
pip install django-cogwheels
1pip install django-cogwheels
2
在幕后,调用django的django.apps.apps.get廑model() 方法,并缓存结果,以便快速有效地处理同一模型的重复请求。
常见问题
当然可以。
WagTailMenus 使用齿轮来管理应用程序设置。见: https://github.com/rkhleics/wagtailmenus/tree/master/wagtailmenus
您可能还想查看cogheels本身中的 测试 应用程序,其中包括许多示例: https://github.com/ababic/django cogheels/tree/master/cogheels/tests
不,这只是个建议。每个人都有自己的偏好,他们如何组织他们的项目,这一切都是好的。只要您将 defaults.py 和 settings.py 保存在同一目录中,一切都会正常进行。
如果您希望 defaults.py 和 settings.py 生活在不同的地方, 齿轮也支持这一点。但是,您必须设置设置助手类上的faults_path 属性,以便它知道在哪里查找默认值。例如:
pip install django-cogwheels
3
很快将添加更完整的文档。同时,如果您想知道弃用定义是什么样子的,您可能需要查看应用程序的设置帮助器定义:https://github.com/ababic/django-cogheels/blob/master/cogheels/tests/conf/setting s.py" rel="nofollow">https://github.com/ababic/django coghwheels/blob/master/coghwheels/tests/conf/settings.py
cogWheels执行的唯一验证是设置应该引用django模型和其他重要表的值,并且只有在使用setting s.models.setting\name, settings.modules.setting\name 或 settings.objects时才会触发此验证。在代码中设置名称以导入和访问对象。
目前无法配置"齿轮"来对其他设置值应用验证。
我确实打算支持将来的版本,但我不能保证什么时候。
如果这让您感到厌烦,请记住,对于开发人员来说,故意使用不适当的覆盖值进行设置不符合任何人的利益。只要您的文档能够很好地解释预期值的规则/边界,那么问题应该很少出现。
啊,是的。 sys.modules[\uu name\uuu]=myappsettingshelper() 位。我知道有些开发人员可能会认为这种肮脏/老套/不通俗/随便什么。我不得不承认,我也有一段时间对此不确定。
我同意看到这段代码在使用中有些"不寻常"。也许是因为它在很多情况下不是特别有用,或者是因为错误地使用这些特性可能会以奇怪的、难以调试的方式破坏事物。但是,对这项黑客技术的支持是行不通的,在cogwheels案例中,它是有用的,因为它消除了在in it.py中实例化事物的需要(我不喜欢它有很多原因)。
如果你仍然不放心,也许guido van rossum(python的创始人)可以让你安心吗? https://mail.python.org/pipermail/python ideas/2012-05/014969.html
兼容性
当前版本的测试兼容以下各项:
- django版本1.11到2.1
- python版本3.4到3.7