触摸Django

从昨天开始看了下Django这个Python框架,Django在国内的Python社区里还是挺火的。看来文档的tutorial部分,有了基本的了解。结构非常清晰,不像Zope非常深Innocent。相比Plone这种完整的系统来说,Django只是提供了快速开发的框架,这样适应性更强,虽然Django是源自新闻系统,但Profile不像Plone这样定性。tutorial部分很好的说明了:

Object-relational mapper

Define your data models entirely in Python. You get a rich, dynamic database-access API for free — but you can still write SQL if needed.

Automatic admin interface

Save yourself the tedious work of creating interfaces for people to add and update content. Django does that automatically, and it’s production-ready.

Elegant URL design

Design pretty, cruft-free URLs with no framework-specific limitations. Be as flexible as you like.

Template system

Use Django’s powerful, extensible and designer-friendly template language to separate design, content and Python code.

这些官方的描述。

Djangobook之模板系统

今天花了些时间看Djangobook的翻译文章。感叹她的模板系统和URL配置非常有杀伤力。我来把文章的模板系统总结一下,详情还是去这里

根据Djang的设计哲学,模板所有需要的变量通过Context传过来,所以模板只能组织数据。

使用变量如:{{foobar}}。

{% %}组成块标签,在块标签中可以使用if/else做逻辑判断;使用for foo in bar来遍历变量,在使用for foo in bar的时候,还可以使用forloop变量,提供循环信息;ifequal/ifnotequal用来比较两个变量之间的关系,当然支持else。

注释使用{# comment #}。

过滤器”|”,了解linux都知道“管道”,这里意思差不多。例子:{{ my_text|escape|linebreaks }} 。

使用{% include ‘foobar’ %}来导入其它的模板文件。

最后颇具杀伤力的继承,你可以定义一个基本的模板,并在里面设计相应的block。 然后让其它模板继承于他,你可根据需要来重载相应的block。这样可以最大化减少冗余。详细说明请参考文章原文。

在Ubuntu上构建Django开发环境

最近,在Ubuntu7.04上面构建Django的开发环境时,还真碰到点头痛的问题,但最终还是解决了,于是作个笔记。

在Ubuntu7.04中,默认安装的Python是2.5,这个版本比较新,可能有些包不支持,所以我还要装个Python2.4。python2.4-dev这个包必须要装,否则在编译其它包的时候,会说Python.h和 structmember.h 文件找不到。

apt-get install python2.4 python2.4-dev

这之后,我有个头痛的问题,在这之前我安装了beryl的管理器,这个管理器是用Python写的,所以要注意版本问题,不要随便改动/usr/bin/python的指向。你可以在/usr/bin/beryl-settings的第一行指定用什么Python版本。

接着,我使用mysql作数据库服务,所以需要安装mysql和mysqldb,mysqldb是用于python与mysql通信的包。

apt-get install mysql-server

apt-get install libmysqlclient15-dev

由于Python提供了easy_install的工具,所以我们就通过这个来安装Python的包,当然要先安装这个东西,这个说明有详细。安装完毕后,可以在/usr/bin/easy_install里面更改Python路径,我这里指定为python2.4。然后安装mysqldb。

easy_install MySQL-python

至于Django的安装参考官方说明 

会了方便管理代码,最好建个版本管理。我使用的subversion,有机会试度Bazaar。

apt-get install mysql-query-browser

这是官方提供的图形管理程序。

apt-get install rapidsvn

这是一个svn的图形化管理程序。

至于开发工具,可以根据自己的喜好来选择吧。其实,eclipse+pydev+Subclipse是个不错的选择。

MediaTemple的Django容器

由于计划使用Django来开发一个站点,所以在关注虚拟主机的情况。以前在v2ex.com那里知道MediaTemple,所以就在上面找了找,现在还无法支持Django,但在官方的Weblog中找到了Django容器正在开发的信息。而且,多数据库的功能也在开发。

How many database users does my (gs) Grid-Service come with?
Each (gs) Grid-Service currently comes with a single database user capable of creating up 100 databases. We are working to allow multiple database users per (gs) Grid-Service and expect to have this feature available soon.

如果要买MediaTemple(gs)的服务的话,那每年要支付$200。 

Django的文件上传

前几天,使用Django的FileField的时候发现非常不好用,并不是每一个文件都需要存放在以日期为名称的目录下面。在网上的论坛看到的方法是一个新的类继承FileField,并重载两个方法,但这样做的话就不能重新生成sql语句了,这样有点不爽。后来发现一个方法是重载Model的_save_FIELD_file方法,这样各个class之间互不影响。而且对文件的生成可以做得极大的控制。比如:上传一个zip文件夹,并解包保存。

django的测试框架

虽然知道单元测试的好处,但一直没有运用起来。在django的svn版本中,新的测试框架正在开发中,已经有一个文档了。虽然没仔细看,但已经可以测试页面级别了。非常有意思,看来还是把单元测试搞起来才行。

Django和TDD

Django是一种敏捷的高级开发框架,在敏捷开发框架中Testing是非常重要的 ,在Django的最trunk中,已经加入了完成的Testing功能,这里并不想描述Testing怎么使用,Testing文档已经非常详细了。

在使用Django之前,我对测试还是一头雾水,只是了解一点敏捷开发。但使用Django后,我发现Django是在“强制”你做各种测试。

要开发Django的应用,首先需要定义Model,并且在Modle中定义数据表项,根据Django的设计哲学,在Model中封装所有的领域逻辑,领域逻辑是设计模式的一种,不太懂的google一下。这样的你就可以通过Testing来对你的Model进行测试了。除了对Model进行Testing外,你还可以对newforms进行测试,虽然newforms使用起来并不简单,有时会感觉到大才小用,但通过Testing可以保证你的newforms的正确性,而且可以封装一些业务逻辑,当表单校验成功后,可以执行某一个方法来完成某个业务逻辑。

除了对Models进行测试外,Django还提供Test Client,用于对Http级的内容进行测试,这样连View也一快测试了。

而且,Django现在支持doctests和unit tests,doctest是python的测试框架,非常“pythonic”,呵呵。

总之,不管是有意还是无意的Django都在“强迫”你做TDD,这样能让你的开发更加敏捷。

Django中Signals发送两次问题

在Django中Signals是非常有用的机制,这类似于一些钩子函数,留下让开发者来控制方法的机制。

但在Django中,有非常令人讨厌的问题,就是有些时候Signals会发送两次,这个问题早在django 1.0之前的版本中就有,但是这个问题在django1.0的时候依然存在,不过提供了解决的方法,在connect的时候,会有一个dispatch_uid的参数,如果指定这个参数话,就不会出现上述问题。这个功能是在Signals重构然后被添加的。

http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#Signalrefactoring