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

时间:2015-01-30 14:54:01

标签: python global-variables nonetype

我正在处理Python中的全局变量。代码应该可以正常工作,但是存在问题。我必须使用全局变量作为类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类的实例?感谢

1 个答案:

答案 0 :(得分:5)

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

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

使用@app.before_first_request function代替;保证在处理此进程的第一个请求时执行。如果您转移到使用多个子进程来扩展站点的正确WSGI容器,这也可以保持全局工作:

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