route.py
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)
def add_rule(blueprint, url_rule, import_function_name, **options):
function = LazyView(import_function_name)
blueprint.add_url_rule(url_rule, view_func=function, **options)
server/route.py
from route import add_rule
from view.courier import blueprint as courier
from view.files import blueprint as files
from view.root import blueprint as root
add_rule(root, '/', 'view.root.index', methods=['GET'])
add_rule(root, 'login', 'view.account.login', methods=['POST', 'GET'])
add_rule(files, 'ajax_upload', 'view.files.ajax_upload', methods=['POST'])
add_rule(courier, 'list', 'view.courier.courier_list', methods=['GET'])