在第二次路由时,Flask应用的导入不起作用。
在第二次路由时,Flask应用的导入不起作用。
当我在flask路由中第一次导入一个文件时,当我访问该路由时,导入是有效的,但第二次以及之后就无效了。我的两个文件都在同一个名为main的目录中。
├── main │ ├── main1.py │ └── main2.py
main1.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return "hello" @app.route('/call') def call(): #这就是我所说的导入 import main2 print("main1") return "call" if __name__ == "__main__": app.run(debug =True, host='0.0.0.0',port = '5005')
main2.py
print("main2")
终端输出在http://0.0.0.0:5005/call上(访问URL 3次,我们可以看到3个输出)
* Serving Flask app "main1" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5005/ (Press CTRL+C to quit) * Restarting with inotify reloader * Debugger is active! * Debugger PIN: 226-069-185 127.0.0.1 - - [30/Apr/2020 10:48:42] "GET / HTTP/1.1" 200 - main2 main1 127.0.0.1 - - [30/Apr/2020 10:48:46] "GET /call HTTP/1.1" 200 - main1 127.0.0.1 - - [30/Apr/2020 10:48:49] "GET /call HTTP/1.1" 200 - main1 127.0.0.1 - - [30/Apr/2020 10:48:50] "GET /call HTTP/1.1" 200 -
第一次输出是按预期的方式进行的,导入有效,我们可以看到打印了'main2',但是再次多次访问时导入不起作用,我看不到'main2'的打印输出。
问题的出现原因是在导入文件时,文件会被解析和加载,如果文件中有print语句,那么在导入文件时这些print语句会被执行。解决方法是在main2.py中声明一个函数,并在main1.py中调用该函数,这样每次访问call时都会执行一次该函数。下面是一个可行的示例代码:
main1.py文件内容如下:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return "hello" @app.route('/call') def call(): from main2 import function2 return "Hello from " + function2() if __name__ == "__main__": app.run(debug=True, host='0.0.0.0', port='5005')
main2.py文件内容如下:
def function2(): return 'world2'
这个解决方法解决了我的问题,但我还在寻找更好的解决方法,参考了这个链接:How to prevent a module from being imported twice? 感谢Shubin的解答。