如Flask not finding routes in imported modules中所述,我在Python 2.7中有一个非常简单的Flask应用程序,当我的路由在不同的模块中定义时,它不起作用。
总结一下,我在顶层有run.py
,它声明了Flask app
变量,然后导入了定义视图的views.home
模块。
我发现如果我从run.py
切换导入语句:
import views.home
到
from views.home import *
一切正常。
为什么?据我所知(https://softwareengineering.stackexchange.com/questions/187403/import-module-vs-from-module-import-function),两个导入之间的任何功能都不会影响Flask的行为吗?
答案 0 :(得分:0)
使用import views.home
导入时,在您使用视图的位置,您使用的是
views.home.somefunction()
或者你在使用:
somefunction()
第二个只在执行from views.home import *
时才有效,因为这会将所有内容放在全局命名空间的views.home上。
答案 1 :(得分:0)
我已经设法解决了正在发生的事情(根据Flask not finding routes in imported modules)
基本上,当run.py
作为脚本运行时,其名称为__main__
,并在sys.modules
中注册为__main__
(根据Importing modules: __main__ vs import as module )
然后当我从app
中的run.py
导入views.home.py
时,python无法在run
中找到sys.modules
模块(因为它被称为{{1}然后创建__main__
的新实例,并在run.py
中将其注册为名称sys.modules
。
此时,run
中有run
个模块的两个实例,因此,sys.modules
变量的两个实例。
app
使用views.home.py
的一个实例注册其路由,app
启动run.py
的另一个实例,因此app
的路由是从未使用过。
原因
views.home.py
有效是因为它创建了from views.home import *
模块中所有views.home
函数的引用(根据`from ... import` vs `import .`),这导致__main__
的路由正在注册views.home.py
变量thatr app
的实例。