配置12因素Django应用的“一站式”商店
项目描述
配置12因素Django应用的“一站式”商店
从环境变量获取设置的简单API。
支持多种电子邮件、缓存和数据库后端。
易于定制和扩展。
许多Heroku附加组件的单行自动配置。
基本设置
在您的Django项目的settings.py
import envsettings
SECRET_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()进行一些黑客式操作
import envsettings
locals().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。
例如,您可以通过运行以下命令来配置您的应用程序通过Mailgun发送电子邮件
heroku addons:add mailgun:starter
默认情况下,它将使用每个提供商的SMTP端点,但如果它检测到已安装适当的后端(见上方列表),它将配置Django使用HTTP端点,这将更快。
缓存设置
import envsettings
CACHES = {'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-redis包)
# 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。
自定义和扩展
Django EnvSettings 设计为可以通过继承现有的设置提供程序(CacheSettings、EmailSettings 或 DatabaseSettings)之一轻松扩展。
更改默认配置
显然,您可以在从 envsettings 返回配置字典后对其进行修改。但是,您也可以为每个后端设置默认值,同时让环境确定要使用哪个后端。例如
envsettings.database.CONFIG['postgres']['OPTIONS'] = {
'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE}
支持新的后端
要添加新的后端,继承适当的设置类。然后您需要向 CONFIG 字典中添加一个键,将您要为后端使用的URL方案映射到该后端的默认配置。您还需要添加一个名为 handle_<URL_SCHEME>_url 的方法,该方法将传递来自 urlparse 的输出和默认配置。该方法应使用解析的URL中的值来适当地更新配置。
例如
import envsettings
class CacheSettings(envsettings.CacheSettings):
CONFIG = dict(envsettings.CacheSettings.CONFIG, **{
'my-proto': {'BACKEND': 'my_cache_backend.MyCacheBackend'}
})
def handle_my_proto_url(self, parsed_url, config):
config['HOST'] = parsed_url.hostname or 'localhost'
config['PORT'] = parsed_url.port or 9000
config['USERNAME'] = parsed_url.username
config['PASSWORD'] = parsed_url.password
return config
cachesettings = CacheSettings()
CACHES = {'default': cachesettings.get('CACHE_URL')}
支持新的自动配置选项
要添加新的自动配置提供程序,继承适当的设置类,并添加一个名为 auto_config_<PROVIDER_NAME> 的方法。这将传递一个环境变量字典,并应返回适当的配置URL或None。
自动配置方法按字典顺序尝试,因此如果您想强制方法首先尝试,您可以将其命名为 auto_config_00_my_provider 或类似名称。
以下是一个示例
import envsettings
class CacheSettings(envsettings.CacheSettings):
def auto_config_my_redis(self, env):
try:
host = env['MY_REDIS_HOST']
password = env['MY_REDIS_PASSWORD']
except KeyError:
return None
else:
return 'redis://:{password}@{host}'.format(
host=host, password=password)
cachesettings = CacheSettings()
CACHES = {'default': cachesettings.get('CACHE_URL', auto_config=True)}
兼容性
在Python 2.7、3.3、3.4 和 PyPy 上测试过,与Django版本 1.4 — 1.7 兼容。
问题 & 贡献
许可证
MIT许可
项目详情
下载文件
下载适用于您的平台文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。