如题,重构项目时组织文件遇到一个循环导入问题。
通常 web 应用做法是将视图单独拿出来放在一起,路由也拿出来放在一起,等等等等,然后启动服务时从程序入口一股脑的导入。但是为了方便使用,我们希望将程序所有配置集中起来放在入口处,这样启动时就可以轻易地开关功能。
所以比如一个典型情况,在程序入口(假设名为 app.py )处我们需要定义一个 jinja2 template,这种模板文件夹的位置属于配置问题,不适合写死在业务模块里。但这些 template 又需要被业务模块所调用,比如某个路由返回某个渲染后的模板之类的。这就产生了,视图需要导入 app.py 里的内容,而 app.py 又需要导入视图才能运行,产生了循环导入的问题。
通常的 web 框架有很多变通的解决办法,比如偏函数、装饰器、或者一些共享状态组件之类的。但是 fastapi 由于注入了参数化模块,导致比如在下面的视图逻辑中
@app.get('/')
async def root(request:Request , template: jinja2.Tmeplate):
return template.RenderResponse('index.html' , {'title':'hello world'})
root = functools.partial(template = template)
比如这种方式是行不通的,所有输入参数都会被 fastapi 拿来进行参数检查。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.