更新记录:

1. 增加静态文件的支持。目前你只要在任何一个views文件中增加以下内容:

from frameworks.SimpleFrame import static_serve
@expose(‘/static/<regex(".*$"):filename>’)
def static(filename):
    return static_serve(request, filename)

这样一旦你的链接是/static/filename时,kuaiboo会自动查找所有app下的static文件夹,如果找到则返回这个文件。这里expose可以使用<regex("pattern"):argu_name>的形式进行正则式的匹配。注意正则式需要使用双引号引起来。这个静态文件处理支持条件返回,即如果文件没有改变,则返回304,文件将不会下传。同时支持406 Partial Content下传,可以支持分块下传。当然这些是webob已经提供的,同时参考了webob的这篇文档。因此实现已经很方便。这样在你刷新时,如果静态文件已经下传,再刷新时,会在console的日志中看到304。不错。

一旦部署到生产上,你可能会想使用web server来做静态文件的处理,没问题。只要将所有app下的static文件汇总到一起,统一由web server提供服务就可以了。这个汇总工具还没有做,以后再说,很简单。

2. 扩展werkzeug的URL Converter,扩展了一个正则式的Converter,可以从上例看到。

3. 扩展views函数的func_globals内容,现在有:

    def _prepare_env(self):
        env = {}
        env['url_for'] = url_for
        env['redirect'] = redirect
        env['url_map'] = url_map
        env['render'] = self.render
        env['config'] = config
        from werkzeug import html, xhtml
        env['html'] = html
        env['xhtml'] = xhtml
        from utils import Form
        env['Form'] = Form
        return env
       
    def get_env(self, request, response):
        env = self.env.copy()
        env['request'] = request
        env['response'] = response
        return env

以上在env中的key对应的对象都是你可以直接在views函数中使用的。

4. 将expose放到__builtin__模块中,这样在views文件中,你不需要导入这个函数,可以直接使用,就象是使用内置函数一样。可以减少不必要的导入。目前我只放入了这个。

5. 在request创建后,将appname和function绑定到request对象上,因此你可以直接使用request.appname得到views函数对应的app名字。这样当使用url_for来生成url时,一般是这样的:

url_for(‘Hello.views.index’, **kw)

但这样你的appname是写死的,这里是Hello,但如果你的app改名了怎么办,那么现在可以使用:

url_for(‘%s.views.index’ % request.appname, **kw)

现在你在Hello App中的index.html可以看到这种用法。

6. 增加了一个default_config,将用来放置一些缺省的配置。同时将settings改为config了。这样你可以使用config来读取配置在settings中的信息。它是一个Storage对象。这个Storage是从web2py中弄过来的,它就是一个dict,但是可以使用obj.attr的方式来引用key,同时如果不存在则返回None。那么你使用起来就和Module差不多了。但是对不存在的变量不会抛异常。同时所有配置项需要大写,这一点与django相同。

7. 在views你可以调用redirect(url)来进行转换。原来需要使用return,现在只要调用就行了。它会引发一个异常,并且被Dispatcher处理。

8. 在views中还可以使用error(**kw)来引发一个错误,它会自动调用一个错误模板,同时你也可以自已来指定出错模板。它也会引发一个异常,并且被Dispatcher来处理。


3条评论

  1. Dispatcher从何而来?觉得有点magic:)

    我觉得用异常来控制正常的程序流程有点滥用.

    其实用这种

    return redirect(url)

    形式是否清晰?

    否则用户可能会困惑不知道函数是在哪里返回(当这种函数多起来以后).

    个人意见,仅供参考:)

    最后希望建立一个google group,方便讨论,blog评论太痛苦

  2. Dispatcher是SimpleFrame中的WSGI的application类。这里只是说它会被处理掉。

    最早redirect是会返回一个response对象,是需要return的,不过为了省事所以改成了抛出异常了,应该更方便。我想这一点通过示例,通过文档可以说明清楚。还有象error也是类似的用法。这种用法不会太多,只有非正常流程才会使用。不过这个修改并不麻烦,不过可以先用一用。

    另外希望就在python-cn中讨论,可以加上[kuaiboo]的声明。因为单建一个邮件列表过于分散。

    感谢你的意见。欢迎多多交流。

  3. 现在想一想采用类的方式只是组织代码可能方便一些,其它的用处不大。

发表评论

评论也有版权!