向 #Uliweb# 的 view 中增加类的支持 作者 @limodou

经过努力,今天完成了在View中增加对类的支持。原来的Uliweb只能支持普通函数,它的好处就是简单。不过,经过考虑,觉得使用类也不错。不过,对于类的支持明显要比简单的支持函数要复杂多。你要考虑:

类上加@expose

类实例方法上加@expose

类方法上加@expose(即使用@classmethod处理过)

静态方法上加@expose(即使用@staticmethod处理过)

同时还要支持原有的expose功能,如:静态url的处理,命名url的处理,还有反向url处理等功能。

下面是一个示例代码:

from uliweb import expose

def __begin__():
    print 'global begin'

@expose('/')
class TestView(object):
    def __begin__(self):
        print 'test begin'

    def hello(self):
        return 'hello %s %s' % (url_for('print'), url_for(TestView.printf))

    @expose('/tprint', name='print')
    def printf(self):
        return 'print'

@expose('/index')
def index():
    return 'hello'

上面的例子有几个特点或要求:

1. class可以是classic class或new style class。比如class A:pass或class A(object):pass都是可以的。

2. 建议不要使用classmethod和staticmethod。

3. 类上要有@expose的处理,不能只加在方法上。在类上加的可以认为是url的前缀。如果类的方法同时加上@expose,则此@expose会生效。如果类方法没加@expose,则此方法将会使用类的url+'/'+类方法名作为url。

4. 如果类方法名以_开头,则不会被自动处理。

5. 对于没有加@expose的类方法,并且不是以_开头的,则会自动根据类的url+'/'+类方法名作为url。第三条已经说了,再增调一遍。

6. 类中可以定义象views一样的__begin__(self)和__end__(self)方法。它会在你调用类方法之前被执行或结束后执行。如果任何一个方法,包括类方法返回非None的值,则直接返回。

7. 如果同时在views和类中定义了__begin__或__end__方法,则对于__begin__,先执行views中的,再执行类中的。对于__end__,则是相反。

8. 对于url_for(),当要处理的为类方法时,可以使用字符串或对象。字符串示例为:appname.views.ClassName.MethodName。对象示例为:TestView.MethodName。

9. 再次强调,建议所有的方法都使用类方法,即带(self),同时没有使用classmethod或staticmethod进行修饰。(虽然我努力使,它们都可用,但是总有不如意的地方)

由于引入类的方式,一方面可以更方便进行复用,但同时会造成更复杂的组合和使用方式,建议考虑使用。使用函数还是最简单的方式。

想了想,还是先把extracturls功能去掉了。虽然可以在启动时加快一些,但是毕竟不方便,启动也不象想象得那么慢。另一种办法就是直接在settings.ini中定义EXPOSES。

转自:http://hi.baidu.com/limodou/blog/item/0e77267ff621281d28388aa1.html

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