全局变量是 None 而不是实例 - Python



我正在处理Python中的全局变量。代码应该可以正常工作,但存在问题。我必须使用全局变量作为类Back的实例。当我运行应用程序时,它说 back 是 None 这不应该是真的,因为setup()函数中的第二行 - 'back = Back.Back()'

# -*- coding: utf-8 -*-
from flask import Flask
from flask import request
from flask import render_template

import Search
import Back
app = Flask(__name__)
global back
back = None
@app.route('/')
def my_form():
    return render_template('my-form.html')
def setup():
    global back
    back = Back.Back()
def is_ascii(s):
    return all(ord(c) < 128 for c in s)  
@app.route('/', methods=['POST'])
def search():
    from time import time
    pattern = request.form['text']
    startTime = time()
    pattern=pattern.lower()
    arr = []
    if len(pattern)<1:
        arr.append('Incorrect input')
        currentTime = time()-startTime
        return render_template('my-form.html', arr=arr, time=currentTime)

    arr = []
    search = Search.Search(pattern,back)
    results =  search.getResults()
    ..................
    return render_template('my-form.html', arr=arr, time=currentTime, pattern=pattern)

app.debug=True
if __name__ == '__main__':
    setup()
    app.run()

为什么 back 变量是 None 而不是 Back 类的实例?谢谢

Flask 开发服务器运行您的模块两次。一次运行服务器本身,另一次在子进程中运行,以便每次更改时它可以重新加载整个脚本。第二个进程不会运行受保护__main__的代码,全局将保留为None

如果你使用另一个WSGI服务器,你会遇到同样的问题;它会将你的文件作为一个模块导入,而不是作为初始脚本,并且__main__保护不会执行。

请改用 @app.before_first_request 函数;保证在处理此进程的第一个请求时执行该函数。如果您移动到使用多个子进程来扩展站点的适当 WSGI 容器,这也会使您的全局工作:

@app.before_first_request
def setup():
    global back
    back = Back.Back()

相关内容

  • 没有找到相关文章

最新更新