一站式配置12 Factor Django应用程序

django-envsettings的Python项目详细描述


Build StatusLatest PyPI version

一站式应用程序配置

  • 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电子邮件加载项: mailgunsendgridmandrillpostmark

因此,例如,您可以通过运行:

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_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

定制和扩展

DjangoEvSt设置被设计为易于通过子类现有的子类扩展 设置提供程序:CacheSettingsEmailSettingsDatabaseSettings

更改默认配置

显然,您可以在配置字典从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.73.33.4pypy上测试, 对于django版本1.4-1.7

问题和贡献

GitHub project上提出问题或 在twitter上轻推@_EvansD

许可证

麻省理工学院授权

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Spark SQL:Sqlite不可解析日期   Java继承、匿名内部类实例成员、安卓回调方法   java交换面板和Swing中的数据传递   IntelliJ random“无法启动Java虚拟机”   带有Eclipse Luna RC3的java Weblogic 12c   java按钮java中的用户界面空指针异常错误   使用安卓 webview时,无法正确计算java Javascript方括号表示法。有什么建议吗?   java JAR文件无法识别我正在JAR中读取的文件的更新   如何解决错误:类java。木卫一。BufferedInputStream无法转换为类javax。xml。使改变后果   java如何获取数组/矩阵中的输出和列的和?   Java/Swing是否有(真实的)Office 2007外观?   在java中从URL提取实时汇率   Simon说的java闪烁按钮   java的收集方法是否足够有效?   位于::0的java错误找不到引用的切入点   java扩展父级的静态嵌套类和也扩展该父级的顶级类之间的差异   java停止向angular http发送响应并从控制器加载新的jsp页面   java JavaFX菜单不会下拉