import pdb;pdb.set_trace()
app = 1
import model
#from model import User #ImportError: cannot import name 'User'
print(app)
print(model)
#print(model.User) #AttributeError: module 'model' has no attribute 'User'
import pdb;pdb.set_trace()
from app import app
User = app + 1
执行顺序
$ python app.py
> /tmp/demo/app.py(2)<module>()
-> app = 1
(Pdb) n
> /tmp/demo/app.py(3)<module>()
-> import model
(Pdb) n
> /tmp/demo/model.py(2)<module>()
-> from app import app
(Pdb) n
> /tmp/demo/app.py(2)<module>()
-> app = 1
(Pdb) n
> /tmp/demo/app.py(3)<module>()
-> import model
(Pdb) n
> /tmp/demo/app.py(4)<module>()
-> print(app)
(Pdb) n
1
> /tmp/demo/app.py(5)<module>()
-> print(model)
(Pdb) n
<module 'model' from '/tmp/demo/model.py'>
--Return--
> /tmp/demo/app.py(5)<module>()->None
-> print(model)
(Pdb) n
--Return--
> <frozen importlib._bootstrap>(222)_call_with_frames_removed()->None
(Pdb) c
1
<module 'model' from '/tmp/demo/model.py'>
回想自己学 Flask 的时候,也在这里被坑的好惨(前几天不长记性又被坑了一次)。
这里有个很严重的问题,你需要小心翼翼地理清导入顺序,而且就算程序跑起来了,
某些模块可能执行了两次,造成意想不到的结果。
解决方法是采用 Flask 最佳实践 https://zhuanlan.zhihu.com/p/22774028
但是呢,这是 Python 的缺陷还是 Flask 的缺陷?
我认为这是 Flask 的设计缺陷,@app.route
看起来简单,全局对象用着一时爽,
但是非常容易产生循环依赖,一不小心就掉坑里了。