前一阵读了Pinax的源代码,尽管大多数地方都是浅尝辄止,但是第一次这么认真地读一个开源项目的代码,感觉收益还是不少。对这些天的收获,以及对Pinax学习的一个总结。
Pinax 几乎用到了Django的所有功能。比如国际化i18n,类似触发器的signals,大量的自定义标签、context_processors和middleware、generic view等等等等。
Pinax全站的模板都继承自site_base.html。这样,如果要去掉或者添加某一个app,只要修改site_base.html就可以了。总体来讲,site_base.html属于“功能性模板”。
site_base.html继承自base.html。它定义了HTML文档的大致结构与布局。如果想要修改站点的整体布局或者是具体风格,应该修改这个模板以及它包含的CSS。
大多数app自己的模板文目录中都会包含一个base.html,区别于全站的html,这个模板负责提供子导航栏和侧边栏。通过让app内的其它模板继承这个模板,也可以做到在修改的时候只需修改一个模板就可以了。
Pinax大量应用了slug,不知道除了程序员和搞SEO的之外会不会有中国人熟悉这东西。所以单纯地将Pinax翻译过来似乎仍然不太符合中国人的使用习惯。
tweets这种app应该直接被枪毙。
此外,Pinax自带一个blog应用,但是支持的集中编码都是我原来没听说过的,估计用户每几个知道的。
不知道是不是复用第三方apps复用多了,感觉整个网站用起来不像一个整体,有些地方的用户体验比较糟糕。例如Inbox的设计,Inbox下设多个子栏目(邮件、消息和提醒等等),无论有消息和提醒,Inbox后面都会多出一个数字提醒。但是无论如何,想看到新收到的提醒都必须点击两次。
实际上不像是一个传统的app,而是借用app的形式扩展了Django,进一步促进了apps之间的分离。实际实现的功能类似于反向的{% block %},它允许一个app定义自己希望被其它的app定义的内容。
举例,app A 可以定义一个 foo.html模板,意为:“我的foo部分可以被其它app包含。”同时app B, C…Z 也定义一个foo.html。任意app的index都可以通过
{% plugin_point "foo " …… %}来包含进搜有app规定的foo.html的内容。但是index对A到Z任意一个app都没有依赖性,可以任意的删除一个app,而不需要对代码做出任何修改。
个人感觉Pinax 对第三方应用的使用已经到了极致。这一段是个人复习用的总结,而且会比较长,所以放在最后:
INSTALLED_APPS = (
# included
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.humanize',
'django.contrib.markup',
#---------------------------------------以上一段都是Django自带的。
# external
# external包括第三方的app以及Pinax中可以独立拿出来嵌入其它项目的app。
'notification', # must be first 发送Email提醒,在网站上的提醒
'django_openid', #支持openid登录
'emailconfirmation', #管理用户的邮箱,并且负责发送确认信。
'django_extensions',
'robots', #管理robots.txt
'dbtemplates',
'friends', #提供部分好友功能
'mailer', #发送邮件
'messages', #站内邮系统。收件箱、发件箱
'announcements', #通知
'oembed', #嵌入维基、视频和图片等内容或媒体
'djangodblog',
'pagination', #分页
# 'gravatar',
'threadedcomments', #实现对物体的评论以及tribes里的讨论话题。
'wiki', #维基,嵌入tribes等apps
#'swaps', #用户见交易的平台
'timezones',#时区支持功能
'app_plugins',#一种app之间包含的机制
'voting',#通用的投票功能
'tagging',#提供标签域,以及常用的标签功能。
'bookmarks',#书签
'blog',#博客
'ajax_validation', #用ajax方式验证表单,通用app。
'photologue',#管理照片,添加了一个供其它Model继承的抽象类,从而添加了许多图片相关的功能。
'avatar',#用户头像
'flag',#举报
'microblogging',#微博客,可以与twitter实现基本的同步
'locations',#一个“签到”的功能,基于Yahoo Map,没有我从名字想象的那么强大。
'uni_form',#将表单以统一的形式,以div布局显示出来。
# internal (for now)
#internal里的app部分在项目中供完全自定义
#另一部分在Pinax的egg里。
'analytics',#嵌入google统计代码
'profiles',#用户档案
'staticfiles',#将所有的媒体文件都复制到一处,并且负责提供静态文档。进攻测试。
'account',#用户账号
'tribes',#小组
'projects',#项目(其实就是带任务的小组)
'misc',#大量供其它apps使用的自定义标签和中间件
'photos',#图片
'tag_app',#标签
'django.contrib.admin',#Django自带的admin
)
发现还有几个没读到的app,包括:
'django_extensions',
'dbtemplates',
'djangodblog',
准备进军Satchmo!