多方比较之后,决定选用python框架django做web开发,选用python而不是php或者asp之类的原因主要是三点:
- 操作系统喜好决定了我不会选择asp。相比windows,更喜欢linux;
- php的类C语法打动了我,兼之历史悠久,与mysql的结合也很好,只是我总觉得php离我心中的编程感觉远了点;
- python缩进在有代码洁癖的我看来很优雅,而且python用途更广泛。
这一次使用nginx+django的过程中,解决了之前的一些问题:比如关于URI(尤其是静态文件的URI)解析的问题。按照django官方文档的说法:Django itself doesn’t serve static (media) files, such as images, style sheets, or video. It leaves that job to whichever Web server you choose. django只针对开发过程提供django.views.static.serve()视图,产品配置则须由web server完成。这个问题包括使用django的admin应用需要面对的admin的media URI解析问题,期间又对nginx配置熟悉了一些。
另一个问题正是关于nginx的,这次把django、php、trac都放在一个虚拟主机下,非常有创意,但绝非有意为之的一个结果是:django和php虽然都使用nginx+fastcgi,但django使用socket方式,而php使用host方式;trac则使用nginx对apache作反向代理。如此混搭的方式,与其说是为了实验各种实现,不如说我尚未找到统一的方案,尤其是针对trac的nginx+fastcgi socket的配置方案。
第三个问题是针对开发和产品采用不同配置带来的问题。这篇文章通过判断当前主机的名称决定使用哪种配置。方法简单有效,只是当开发主机与产品主机相同时需要动动脑筋;相比之下,我觉得这篇文章介绍的方法更加通用。
由于涉及项目具体配置,有必要对本文提到的项目名称和目录进行说明,参考时请注意作相应修改:
- 项目名称:
fox; - 项目位置:
/home/yulefox/fox; - 开发用配置文件:
/home/yulefox/fox/settings/development.py; - 产品用配置文件:
/home/yulefox/fox/settings/production.py;
项目fox创建时,django在项目目录/home/yulefox/fox下生成对应的配置文件settings.py。为了能够针对开发及产品使用不同的配置文件并便于管理,我们将其移至新建目录settings下并重命名为development.py,并在该目录中创建名为__init__.py的空文件以保证该目录可作为包使用。此时当我们使用python manager.py runserver命令运行开发服务器时,得到以下结果:
Validating models...
0 errors found
Django version 1.2, using settings 'fox.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
我们注意到,django并没有使用我们修改后的配置fox.settings.development。这是由于项目中的manager.py导入的配置没有改变,将manager.py中的settings替换为settings.development后,再次运行得到以下结果:
Validating models...
0 errors found
Django version 1.2, using settings 'settings.development'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
结果证实修改生效,不幸的是,这并不是终点,因为当我们打开http://127.0.0.1:8000/时,我们看到了以下错误信息:
ImportError at /
No module named fox.urls
容易想见,这应该正是因为修改配置文件目录的问题,我们可以通过在python manager.py shell中输出sys.path的结果来印证这一点,输出中包含了项目目录/home/yulefox/fox而非项目的父目录/home/yulefox,显然,项目fox中不再有一个名为fox.urls的model,python为我们提供了一个名为PYTHONPATH的环境变量,我们可以通过设置该环境变量因应配置文件目录的变化:export PYTHONPATH=/home/yulefox。
另外,我们可以无需修改manager.py和使用python manager.py runserver解决本文提到的配置问题。django提供了环境变量DJANGO_SETTINGS_MODULE以设置所使用的配置文件,如本文中:export DJANGO_SETTINGS_MODULE=fox.settings.development。这种情况下,我们需要使用django-admin.py runserver启动服务器。
上面介绍的开发配置方式同样适用于产品配置方式,我们只需在settings包中添加并配置production.py即可。在Apache中,我们可以直接在虚拟主机配置文件中使用SetEnv DJANGO_SETTINGS_MODULE fox.settings.production完成对环境变量的配置;而在Nginx中,如果使用fastcgi,则可以使用manage.py runfcgi --pythonpath=/home/yulefox/fox --settings=fox.settings.production来完成配置;wcgi等实现方式需要读者自行完成。




