延迟加载视图¶
Flask通常用于装饰。修饰符很简单,在为特定URL调用的函数旁边有一个URL。然而,这种方法有一个缺点:它意味着所有使用装饰器的代码都必须预先导入,否则flask将永远无法真正找到您的函数。
如果应用程序必须快速导入,这可能是一个问题。它可能必须在谷歌的应用引擎或其他系统上做到这一点。因此,如果您突然发现您的应用程序不再使用这种方法,您可以返回到一个集中的URL映射。
启用中心URL映射的系统是 add_url_rule()
功能。您没有使用装饰器,而是有一个使用所有URL设置应用程序的文件。
转换为集中式URL映射¶
假设当前应用程序看起来有点像这样:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
pass
@app.route('/user/<username>')
def user(username):
pass
然后,使用集中式方法,您将有一个带有视图的文件(:file: ' views.py '),但是没有任何修饰符:
def index():
pass
def user(username):
pass
然后是一个文件,它设置了一个将函数映射到URL的应用程序:
from flask import Flask
from yourapplication import views
app = Flask(__name__)
app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/user/<username>', view_func=views.user)
加载后期¶
到目前为止,我们只拆分视图和路由,但是模块仍然是预先加载的。技巧是根据需要实际加载视图函数。这可以通过一个助手类来实现,该类的行为与函数类似,但在第一次使用时在内部导入真正的函数:
from werkzeug.utils import import_string, cached_property
class LazyView(object):
def __init__(self, import_name):
self.__module__, self.__name__ = import_name.rsplit('.', 1)
self.import_name = import_name
@cached_property
def view(self):
return import_string(self.import_name)
def __call__(self, *args, **kwargs):
return self.view(*args, **kwargs)
这里最重要的是 __module__ 和 __name__ 设置正确。flask在内部使用它来计算如何命名URL规则,以防您自己没有为规则提供名称。
然后,您可以定义中心位置来组合如下视图:
from flask import Flask
from yourapplication.helpers import LazyView
app = Flask(__name__)
app.add_url_rule('/',
view_func=LazyView('yourapplication.views.index'))
app.add_url_rule('/user/<username>',
view_func=LazyView('yourapplication.views.user'))
您可以通过调用:meth: ' ~flask.Flask的函数,进一步优化编写这个函数所需的击键量。add_url_rule '通过在一个字符串前面加上项目名称和一个点,并根据需要在一个' LazyView '中包装' view_func '。:
def url(import_name, url_rules=[], **options):
view = LazyView(f"yourapplication.{import_name}")
for url_rule in url_rules:
app.add_url_rule(url_rule, view_func=view, **options)
# add a single route to the index view
url('views.index', ['/'])
# add two routes to a single function endpoint
url_rules = ['/user/','/user/<username>']
url('views.user', url_rules)
要记住的一件事是,在请求处理程序之前和之后,必须在一个预先导入的文件中,才能在第一个请求上正常工作。同样的情况也适用于其他任何类型的装饰师。