合理的组织django的settings文件

django在一个项目的目录结构划分方面缺乏必要的规范,因此不同人的项目组织形式也千奇百怪,而且也很难说谁的做法就比较好。我根据自己的项目组织习惯,发布了一个项目dj-scaffold
前些天在reddit上为我的项目dj-scaffold打了个“广告”(见:http://redd.it/kw5d4)。不想评价甚糟,甚至差点被打成负分。其中更也人将这个项目说的一文不值。面对负面声音虽然会有些不爽,但其中的建设性意见还是需要听取的,至于那些纯属个人偏好部分就自动过滤了。
在谈及settings文件如何组织时,coderanger建议参考The Best (and Worst) of Django中的做法。文中的主要观点是开发环境和生产环境的配置都需要放到VCS中进行版本控制。参考文中的做法,我对settings模块做了部分调整。注:代码 https://github.com/vicalloy/dj-scaffold/tree/master/dj_scaffold/conf/prj/sites/settings

local_settings的弊病

为将项目的默认配置和本地配置区分开,最常用的做法是增加一个local_settings.py文件,并在settings文件的最后对该文件进行import。

try:
    from local_settings import *
except:
    pass

由此引发的问题是你不能对local_settings.py进行版本控制,部署环境的配置万一丢失将难以找回。

解决方案

针对该问题,建议的解决方案如下

合理的配置文件组织方式

|~settings/
| |-__init__.py
| |-base.py   #默认配置信息
| |-dev.py    #开发环境的配置
| |-local.sample    #本地的扩展配置在dev和production的最后进行import
| |-pre.sample    #设置当前使用的配置为生产环境还是开发环境
| `-production.py    #生产环境的配置

使用方式

DJANGO_SETTINGS_MODULE

django的admin脚本提供了settings参数用于指定当前使用的配置文件

django-admin.py shell --settings=settings.dev

在wsgi脚本中则可直接设置需要使用的settings

deploy.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = settings.production

简化参数
当然,如果每次使用django-admin.py的时候都要带上settings参数还是非常恼人,所以推荐的做法是在pre.py中配置自己所需要使用的配置文件。

SETTINGS = 'production' #dev

合理的组织django的settings文件》有4个想法

  1. photon


    如果settings相对固定,可以django-admin命令连同参数一起放到shell文件里,需要的时候去改这个文件。不过如果settings文件经常变换的话,也会挺麻烦。

  2. vicalloy 文章作者

    恩,我一般也会写个简单的shell脚本,在里面为python django-admin.py创建一个$mg的快捷方式。
    不过这个脚本是直接放在版本库中的,不好直接改这个文件。

  3. snowleung

    还活跃在DJANGO上,真是觉得兴奋啊!
    有个关于文件中文名的问题,上传的时候文件名是中文的话就会出现UnicodeEncodeError错误。
    求解~GOOGLE了很久了。没法解决。有说是apache的问题,有说是python的编码问题,各种混乱

  4. vicalloy 文章作者

    你直接用django的开发服务器试试,看能否正确处理。
    好像请求通过apache、lighttpd之类的web服务器转发后是会出些问题,太具体的也没太研究过。

评论已关闭。