Django 1.3新功能与Uliweb 作者 @limodou

这几天Django 1.3发布了。于是查看了一下更新说明,有几点可以和uliweb对比一下。(虽然我已经不玩django了,但是学习别人的长处,了解其它框架的特性和 功能还是很重要的,更重要的是如果有好的东西可以不断充实uliweb。框架之间其实在许多地方都是相通的。)

由于不是Django新功能的介绍,而是与uliweb的对比,所以只会讨论与uliweb有关的内容。

1. 基于class的view

我只是看了个大概,了解到以前的generic view都有class的写法。与url的配置方式还是通过urls.py来完成,比如:

urlpatterns = patterns('',
    (r'^publishers/$', ListView.as_view(
        model=Publisher,
    )),
)

这里可以看到要使用ListView.as_view()的形式。可以传入象model, template_name之类的参数。不过只看文档,我的确有一些没有看到,比如:

a. request是如何处理的,从文档中看不到有不使用generic view的例子。

b. 好象是没有直接对类本身直接使用decorator的,都是对类或实例的方法来处理。比如在urls.py中:

urlpatterns = patterns('',
    (r'^about/',login_required(TemplateView.as_view(template_name="secret.html"))),
)

或者在views.py中:

class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

c. 好象一个类,只能对应一个url吧,因为的确没看到可以同时支持多个url的例子。

d. 看到声明中说原来的基于函数的generic view已经不被推荐了。当然,并不表示普通的基于函数的view是不推荐的。

而 uliweb则不同。uliweb的class就是一般的class,可以是new style class(从object派生)或classic class。你可以把@expose放到类或类的方法上去。使用request和response和一般的views函数一样,一般是直接可以使用 (uliweb会自动向view处理函数注入一些常用的全局对象)或者通过from uliweb import request来导入。因此在函数中不需要定义request参数。uliweb中的一个类,可以同时发布多个url。你可以把uliweb中的类看成是 view函数的集合。这些是与Django非常不同的地方。uliweb的class view功能已经在svn中了。

2. 使用python的logging机制

uliweb一直是这样使用的。并且可以在settings.ini中修改它的一些配置。

3. 更容易地处理静态文件

uliweb 设计之初认为Django的app不足的地方,其中一点就是静态文件在app级别的支持。现在终于有了。不过,我当时对Django的app认为不足的地 方还有:没有app级别的配置信息。不知道这个功能Django什么时候能有。不过静态app的实现和uliweb略有差异。比如:

a. 都提供了命令行工具可以抽取静态文件。不过Django还提供了一个查找静态文件在哪的一个命令,uliweb没有。

b. 配置上都是要增加静态文件app来实现。Django还支持全局性的静态文件目录,而uliweb为了复用,不存在全局的目录,而是全部使用app来处理。因此也不需要象Django一样要添加"django.contrib.staticfiles.finders.AppDirectoriesFinder" 。

c. 静态文件反向获取,在django中没看到。但是我记得django是有的。不过在文档中没看到。它主要是使用:

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

 src="{{ STATIC_PREFIX }}images/hi.jpg" />
 src="{{ STATIC_PREFIX }}images/hi2.jpg" />

而uliweb主要是直接向模板中提供了一个url_for_static方法,如:{{=url_for_static('/js/jquery.js')}}

d. 为了支持Debug,Django文档中特别声明了:

from django.conf import settings

if settings.DEBUG:
    urlpatterns += patterns('django.contrib.staticfiles.views',
        url(r'^static/(?P.*)$', 'serve'),
    )

其 实我个人觉得没必要。因为,如果不设成Debug,上面在运行时,如果是开发服务器可能就会出错。另外,如果是使用web server来处理静态文件,/static/开头的URL早就被web server处理掉了,Django就不会再处理了,因此要不要判断Debug我认为是没必要的。

4. 增加了一个render()

它代替了原来的render_to_response(),缺省使用RequestContext。其实,大可不必这么麻烦,都是RequestContext多好。在uliweb中,因为当返回值为字典时,直接会套用模板,所以根据不需要这个东西。

5. 内置的include增加了with

可以用来传入一些变量给将要引用的模板。这个功能其实我前几天正想向uliweb中增加,不过没得空,这几天有时间加上。

其它的与uliweb关系也不大,所以也就不比较了。

未来uliweb将可能会加入直接将内存的数据转为ORM的实例的功能,以便容易地实现对象序列化和反序列化,并且有可能与cache相配合。

以上的比较只是考查了Django中与uliweb有关的一些内容。当然Django是比uliweb完善多了。但同时它也存在不足,当然也许只是我一家之言。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。