84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
在跟着《Flask Web开发:基于Python的Web应用开发实战》这本书中的例子写程序。先用pip安装flask-bootstrap后使用from flask.ext.bootstrap import Bootstrap导入但显示的是这样的:
from flask.ext.bootstrap import Bootstrap
之前还试了flask-script也是这个样子的。
欢迎选择我的课程,让我们一起见证您的进步~~
from flask.ext.xxx import XXX 是老版本flask插件写法。现在应该是from xxx import XXX。
还有些插件是from flask-xxx import XXX;ide左侧项目目录externalLibrary中点开能找到你下的包,看包名是什么;github上看官网推荐写法flask-bootstrap。
最近正在看flask的源代码,具体原理是这样的:
flask\ext__init.__pyimporter = ExtensionImporter(['flask_%s', 'flaskext.%s'], __name__)
importer = ExtensionImporter(['flask_%s', 'flaskext.%s'], __name__)
再看
flask\exthook.py中定义了ExtensionImporter
def __init__(self, module_choices, wrapper_module):以扩展的名称和原名创建导入器。然后在install函数中导入如下:sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self]将自己加入到sys.meta_path。可以理解为如果有对应名称的对象,则导入。可以看下python文档中meta_path的说明。
def __init__(self, module_choices, wrapper_module):
install
sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self]
sys.meta_path
meta_path
总的来说,就是当你导入flask.ext.xxx的时候,可能实际导入的是flask_xxx或者flaskext.xxx。因而IDE无法识别。
flask.ext.xxx
flask_xxx
flaskext.xxx
讲道理,不要使用IDE、不要在win下搞开发
可以跑就行了,ext是动态接口,IDE检测不到很正常
from flask.ext.xxx import XXX 是老版本flask插件写法。
现在应该是from xxx import XXX。
还有些插件是from flask-xxx import XXX;ide左侧项目目录externalLibrary中点开能找到你下的包,看包名是什么;github上看官网推荐写法flask-bootstrap。
最近正在看flask的源代码,具体原理是这样的:
再看
def __init__(self, module_choices, wrapper_module):
以扩展的名称和原名创建导入器。
然后在
install
函数中导入如下:sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self]
将自己加入到
sys.meta_path
。可以理解为如果有对应名称的对象,则导入。可以看下python文档中meta_path
的说明。总的来说,就是当你导入
flask.ext.xxx
的时候,可能实际导入的是flask_xxx
或者flaskext.xxx
。因而IDE无法识别。讲道理,不要使用IDE、不要在win下搞开发
可以跑就行了,ext是动态接口,IDE检测不到很正常