一站式配置12 Factor Django应用程序
django-envsettings的Python项目详细描述
一站式应用程序配置
- Simple API for getting settings from environment variables.
- Supports wide variety of email, cache and database backends.
- Easily customisable and extensible.
- One line auto-config for many Heroku add-ons.
基本设置
在django项目的settings.py:
importenvsettingsSECRET_KEY=envsettings.get('DJANGO_SECRET_KEY','development_key_not_a_secret')# Accepts the strings "True" and "False"DEBUG=envsettings.get_bool('DJANGO_DEBUG',default=True)FILE_UPLOAD_MAX_MEMORY_SIZE=envsettings.get_int('MAX_UPLOAD_SIZE',default=2621440)
电子邮件设置
由于django的电子邮件设置的工作方式,这需要对 locals():
importenvsettingslocals().update(envsettings.email.get('MAIL_URL',default='file:///dev/stdout'))
这将设置EMAIL_BACKEND和需要的任何其他值 配置所选后端。
示例url
标准SMTP后端:
# SMTP without TLS smtp://username:password@host.example.com:25 # SMTP with TLS smtps://username:password@host.example.com:587
用于开发的特殊django后端:
# Console backend file:///dev/stdout # Dummy packend file:///dev/null # File-based backend file:///path/to/output/dir
专有后端(每个后端都需要安装相应的软件包):
# Requires `django-mailgun` mailgun://api:api_key@my-sending-domain.com # Requires `sendgrid-django` sendgrid://username:password@sendgrid.com # Requires `djrill` mandrill://:api_key@mandrillapp.com mandrill://subaccount_name:api_key@mandrillapp.com # Requires `django-ses-backend` ses://access_key_id:access_key@us-east-1 ses://access_key_id:access_key@email.eu-west-1.amazonaws.com # Requires `django-postmark` postmark://api:api_key@postmarkapp.com
Heroku自动配置
像这样传递auto_config=True:
locals().update(envsettings.email.get(default='file:///dev/stdout',auto_config=True))
这将自动检测和配置以下任何Heroku电子邮件加载项: mailgun,sendgrid,mandrill,postmark。
因此,例如,您可以通过运行:
heroku addons:add mailgun:starter
默认情况下,它将使用每个提供程序的smtp终结点,但是如果它检测到 安装了适当的后端(见上面的列表),它将django配置为 使用更快的http端点。
缓存设置
importenvsettingsCACHES={'default':envsettings.cache.get('CACHE_URL','locmem://')}
示例url
用于开发的django后端:
# Local memory locmem:// # Local memory with prefix locmem://some-prefix # File based file:///path/to/cache/directory # Dummy cache file:///dev/null
redis(需要django-redispackage):
# Basic Redis configuration redis://example.com:6379 # With password redis://:secret@example.com:6379 # Specifying database number redis://example.com:6379/3 # Using UNIX socket redis:///path/to/socket # Using UNIX socket with password and database number redis://:secret@/path/to/socket:3
要使用memcached,需要安装以下软件包之一: django_pylibmc,django_bmemcached,pylibmc,mecached
只有django_pylibmc和django_bmemcachd支持身份验证和memcached 二进制协议,所以如果你想使用这些功能中的任何一个,你需要一个 包装。
# Basic Memcached configuration memcached://example.com:11211 # Multiple servers memcached://example.com:11211,another.com:11211,onemore.com:11211 # With authentication memcached://username:password@example.com # Using the binary protocol memcached-binary://example.com:11211
Heroku自动配置
像这样传递auto_config=True:
CACHES={'default':envsettings.cache.get(default='locmen://',auto_config=True)}
这将自动检测和配置以下任何Heroku缓存加载项: memcachier,memcachedcloud,redistogo,rediscloud,openredis,redisgreen。
定制和扩展
更改默认配置
显然,您可以在配置字典从envsettings返回后对其进行修改。 但是,您也可以为每个后端设置默认值,同时让环境确定 使用哪个后端。例如:
envsettings.database.CONFIG['postgres']['OPTIONS']={'isolation_level':psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE}
支持新的后端
若要添加新后端,请子类化相应的设置类。 然后需要向映射的CONFIG字典添加一个键 要用于默认配置后端的url方案 对于后端。您还需要添加一个名为 handle_<URL_SCHEME>_url,它将从urlparse和 默认配置。方法应该使用解析的url中的值来更新 适当配置。
例如:
importenvsettingsclassCacheSettings(envsettings.CacheSettings):CONFIG=dict(envsettings.CacheSettings.CONFIG,**{'my-proto':{'BACKEND':'my_cache_backend.MyCacheBackend'}})defhandle_my_proto_url(self,parsed_url,config):config['HOST']=parsed_url.hostnameor'localhost'config['PORT']=parsed_url.portor9000config['USERNAME']=parsed_url.usernameconfig['PASSWORD']=parsed_url.passwordreturnconfigcachesettings=CacheSettings()CACHES={'default':cachesettings.get('CACHE_URL')}
支持新的自动配置选项
若要添加新的自动配置提供程序,请子类化相应的设置类并添加方法 命名为auto_config_<PROVIDER_NAME>。这将通过一本环境词典 变量,并应返回适当的配置url,或不返回。
自动配置方法以词法顺序进行尝试,因此,如果您想强制方法 要先试用,您可以将其命名为auto_config_00_my_provider,或类似的名称 那。
下面是一个示例:
importenvsettingsclassCacheSettings(envsettings.CacheSettings):defauto_config_my_redis(self,env):try:host=env['MY_REDIS_HOST']password=env['MY_REDIS_PASSWORD']exceptKeyError:returnNoneelse:return'redis://:{password}@{host}'.format(host=host,password=password)cachesettings=CacheSettings()CACHES={'default':cachesettings.get('CACHE_URL',auto_config=True)}
兼容性
在python2.7、3.3、3.4和pypy上测试, 对于django版本1.4-1.7
问题和贡献
在GitHub project上提出问题或 在twitter上轻推@_EvansD。
许可证
麻省理工学院授权