跳转到主要内容

配置12因素Django应用的“一站式”商店

项目描述

Build Status Latest PyPI version

配置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电子邮件附加组件:MailgunSendgridMandrillPostmark

例如,您可以通过运行以下命令来配置您的应用程序通过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_pylibmcdjango_bmemcachedpylibmcmecached

只有 django_pylibmcdjango_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缓存插件: MemcachierMemcachedCloudRedisToGoRedisCloudOpenRedisRedisGreen

自定义和扩展

Django EnvSettings 设计为可以通过继承现有的设置提供程序(CacheSettingsEmailSettingsDatabaseSettings)之一轻松扩展。

更改默认配置

显然,您可以在从 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.73.33.4PyPy 上测试过,与Django版本 1.41.7 兼容。

问题 & 贡献

GitHub项目 上提出问题或随时在Twitter上提醒 @_EvansD

许可证

MIT许可

项目详情


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源代码分发

django-envsettings-1.1.0.tar.gz (12.6 kB 查看哈希值)

上传时间 源代码

构建分发

django_envsettings-1.1.0-py2.py3-none-any.whl (13.3 kB 查看哈希值)

上传时间 Python 2 Python 3