在第二次路由时,Flask应用的导入不起作用。

17 浏览
0 Comments

在第二次路由时,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'的打印输出。

0
0 Comments

问题的出现原因是在导入文件时,文件会被解析和加载,如果文件中有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的解答。

0