向 #Uliweb# 的 view 中增加类的支持 作者 @limodou
类上加@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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。