Flask无法使用' import x.y'注册路线。但是可以使用x.y import *'?

时间:2015-10-01 08:06:28

标签: python-2.7 flask

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的行为吗?

2 个答案:

答案 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的实例。