在廖雪峰老師的python教程實戰中的編寫web框架一節中,見(https://www.liaoxuefeng.com/wiki/1016959663602400/1018490695712544),其中有一個函數add_routes,代碼如下:
def add_routes(app, module_name): n = module_name.rfind('.') if n == (-1): mod = __import__(module_name, globals(), locals()) else: name = module_name[n+1:] mod = getattr(__import__(module_name[:n], globals(), locals(), [name]), name) for attr in dir(mod): if attr.startswith('_'): continue fn = getattr(mod, attr) if callable(fn): method = getattr(fn, '__method__', None) path = getattr(fn, '__route__', None) if method and path: add_route(app, fn)
在廖雪峰老師代碼的基礎上,我作了一些修改。
使用相對簡單的 import_module方法來動態導入視圖函數(控制器)的包,而后使用 walk_packages方法來遞歸動態導入上述包中的所有模塊。
import importlib import pkgutil base = importlib.import_module('app.controller') for loader, module_name, is_pkg in pkgutil.walk_packages(base.__path__, f'{base.__name__}.'): try: sub_module = __import__(module_name, fromlist=['get_submodule']) except ImportError as e: raise e
# 后面代碼略