Django reusable app学习(1)
对目前blog重构的一个主要工作是把blog的部件改进成更优雅的reusable app,这个blog最初的设计已经是把每个部件都做成了单独的app, 但是由于对django app的理解还不够透彻,随着部件增加已经有些混乱。前些时候看了James Bennett在djangocon 2008上的“Reusable Django App”, 学到了一些东西,准备先按照他的建议重新组织现有的app. 刚刚搞到他的书“Practical Django Project”,准备好好读一下。
收集一些资料:
James Bennett的:
http://media.b-list.org/presentations/2008/djangocon/reusable_apps.pdf
http://media.b-list.org/presentations/2008/pycon/reusable_apps.pdf
Django app的现状:
http://mikecantelon.com/downloads/django_pluggables.pdf
如同django自己的开发者所言目前django reusable app仍然是在wild west时代,还有很多提升空间。
James Bennett谈了一些具体的值得学习和改进的地方:
- 允许用户自定义模板,通过参数传入,但给出默认的
e.g. def someview(request, template_name=’someview.html’):
- 必要的可以指定success url, failed url, 同样作为参数传入
e.g. def contact_form(request, form_class=ContactForm,
template_name='contact_form.html',
success_url=reverse('contact_form_sent')):- application 有自己的urlconf, 用reverse()等来产生url而不是hard coded.
- 使用抽象的model, manager is your friend
我自己遇到的几个问题:
- template放在那里?
我一开始的做法是把app自己的相关template放在自己的目录下。 这么做遇到几个问题:(1) 需要为每个app的template在setting中增加path, 如果不同app有template重名可能有问题。 (2) 一个app的页面性质的template很可能需要用另外一个app, 如何整合是个头疼问题。
主流的reuable app的建议是,大部分template 放在projects里,也就是说有用到的app的template都放在一起。 这么做有对的地方也有不爽的地方。对的在于,也许完整页面类的template本来就应该属于project, 而不是某个app. 不爽也很明显,属于一个app的东西被分散在其他地方,而且templates目录下成为一个大杂烩。
- 复杂页面的如何整合?
我发现讲重用的大佬们给出的实例固然好,比如James Bennett自己的blog就是有10几个app组合起来的,但是他们的例子实际上全部非常简单 -- 看看James自己的blog, 简单到极点,因此不存在多个app的view存在于一个页面的问题。
其实这是个经典问题,过去讨论过n次,至今没看到完美方案。 主要问题是,django中每个页面是一个url, 一个url规则对应一个view, 一个view最终必然跑到某个template里去。 那么一个实际的复杂页面,可能包含多个不同app的结果,怎么整合最理想呢?
目前我是采用ajax方式来整合,这简单可行但并不是最理想的方式。
- app之间如何通讯?
当然可以直接调用,或者加上一堆settings,但我考虑的是既然pluggable, 如何能实现一些自动或非侵入的机制,否则那不是pluggable而是dependency了。
- Model 的实现部分在哪里定义?
一个project就是一组apps但跑在同一个的database上,所以最好app里的model应该实际是个抽象的model, 而model的实现也许应该如同template那样一群放在某处?
- 目前已经有很多pluggable app, 他们是否能在GAE上顺利使用?
这个还要有待尝试。
Related posts:
- 自以为是
- 什么是好的Developer experience?
- Looking for partners to attend Startup Weekend Seattle in Mar 19-21
- app-engine-patch is now officially dead
- 警惕Context的push()和pop()
- GAE的blobstore初步体验
- Seattle: 开放P2P云计算平台 / 未来的anti GFW利器?
- Northwest Python Day 2010
- App Engine Patch对支持Generic View的一个问题和解决方案
- Reusable webapp的思考(5)
Search related in web: