[Zope3-Users] Re: Using ZCML for defining global constants ?
Martin Aspeli
optilude at gmx.net
Mon Sep 11 03:33:01 EDT 2006
Andrew Groom wrote:
> Hi there,
>
> I've got a few global constants that I'd like to be available to my
> application and a .zcml file seems to be a sensible place. I'm thinking
> of something like a .zcml file with, e.g.:
>
> <applicationSettings>
> <setting name="name1" value="value1"/>
> <setting name="name2" value="value2"/>
> ...
> </applicationSettings>
>
> This would then be available in a component as a dictionary. Is anythign
> like this already available ?
You could just use <utility>, and thereby group your constants into
logical chunks.
interfaces.py:
class IDatabaseLoginOptions(Interface):
username = Attribute()
password = Attribute()
config.py:
class DatabaseLoginOptions(object):
implements(IDatabaseLoginOptions)
username = 'foo'
password = 'bar'
configure.zcml:
<utility factory=".config.DatabaseLoginOptions" />
used:
opts = getUtility(IDatabaseLoginOptions)
Obviously, this is a bit more work than just declaring some constants in
ZCML, but global constants suffer the same problems whether they're
defined in Python or XML. Parts of your application are making
assumptions that they are there, with very specific names, which are not
type checked.
With the solution outlined above, you can logically separate different
types of options into different utilities, that may be provided in
different ways. For example, your tests can just plug in a different
utility using provideUtility(), no config file swapping to deal with. If
you need some parts of your application to use different settings, you
can provide a local utility, for example, and if you need to make this
configurable by the user in the future, then a site-local (persistent)
utility is the natural place to store it - it'll override the global
registration.
Martin
More information about the Zope3-users
mailing list