惰性载入视图¶

    当你必须快速导入应用时,这就会成为一个问题。在 Google App Engine 或其他系统中,必须快速导入应用。因此,如果你的应用存在这个问题,那么必须使用集中URL 映射。

    函数用于集中 URL 映射,与使用装饰器不同的是你需要一个设置应用所有 URL 的专门文件。

    假设有如下应用:

    1. def index():
    2. pass
    3.  
    4. def user(username):
    5. pass

    在另一个文件中集中映射函数与 URL:

    延迟载入¶

    至此,我们只是把视图与路由分离,但是模块还是预先载入了。理想的方式是按需载入视图。下面我们使用一个类似函数的辅助类来实现按需载入:

    1. from werkzeug import import_string, cached_property
    2.  
    3. class LazyView(object):
    4. def __init__(self, import_name):
    5. self.__module__, self.__name__ = import_name.rsplit('.', 1)
    6. self.import_name = import_name
    7.  
    8. @cached_property
    9. def view(self):
    10. return import_string(self.import_name)
    11.  
    12. def __call__(self, *args, **kwargs):
    13. return self.view(*args, **kwargs)

    上例中最重要的是正确设置 modulename ,它被用于在不提供 URL规则的情况下正确命名 URL 规则。

    还可以进一步优化代码:写一个函数调用 add_url_rule() ,加上应用前缀和点符号。:

    1. view = LazyView('yourapplication.' + import_name)
    2. for url_rule in url_rules:
    3. app.add_url_rule(url_rule, view_func=view, **options)
    4.  
    5. # add a single route to the index view
    6. url('views.index', ['/'])
    7.  
    8. # add two routes to a single function endpoint
    9. url_rules = ['/user/','/user/<username>']
    10. url('views.user', url_rules)

    有一件事情要牢记:请求前和请求后处理器必须在第一个请求前导入。

    其余的装饰器可以同样用上述方法改写。