Django reusable app学习(1)


Django reusable app学习(1)

Published on Wed 31 Dec 2008 01:12 ( 1 year, 8 months ago)
Django Python 学习

对目前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:


Search related in web:

Custom Search

RSS Feed

One click subscribe this blog in your google reader!

Be social!


Want to say something here? please sign in



Blog posts link to this page
What are friends tweeting?
Tags cloud
Monthly Archives