2015-01-30 2 views
1

Я имею дело с глобальными переменными в Python. Код должен работать нормально, но есть проблема. Я должен использовать глобальную переменную, например класс Back. При запуске приложения он говорит, что еще не является ни один, который должен быть не верно, потому что вторая строка в setup() функции - 'back = Back.Back()'Глобальная переменная - это None вместо экземпляра - Python

# -*- 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() 

Почему это задняя переменная None вместо экземпляра класса Назад? Спасибо

+0

И как вы используете свой сервер? С помощью встроенного сервера разработки Flask? –

+0

@MartijnPieters Я поместил все файлы в свой каталог в https://www.pythonanywhere.com/. Я думаю, что на моем компьютере это работает ... У меня есть Windows. –

ответ

5

Сервер разработки Flask запускает ваш модуль дважды. Однажды запустить сам сервер и другое время в дочернем процессе, чтобы он мог перезагрузить весь ваш скрипт каждый раз, когда вы вносите в него изменения. Дело в том, что второй процесс, который не будет запускать защищенный код __main__, а глобальный остается None.

У вас будет такая же проблема, если вы использовали другой сервер WSGI; он импортирует ваш файл в виде модуля, а не как начальный скрипт, а защита __main__ не выполняется.

Вместо этого используйте @app.before_first_request function; он гарантированно выполняется, когда обрабатывается самый первый запрос для этого процесса. Это также позволяет вам работать в глобальном масштабе, если вы перешли в соответствующий контейнер WSGI, который использовал несколько дочерних процессов для масштабирования вашего сайта:

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

Благодарим вас за совет, но у меня все еще такая же проблема. Я разместил эту аннотацию. –

+0

@Milan: Вы уверены, что теперь используете новую версию, используя 'before_first_request'? Вы пытались использовать журнал, чтобы отслеживать, что происходит? Include ['os.getpid()'] (https://docs.python.org/2/library/os.html#os.getpid) приводит к тем входам в журнал, чтобы отслеживать, какой процесс работает. –

+0

Да, я. Наконец, я решил это, используя singleton. Просто сделайте одноэлементный класс Back, а затем везде, где есть переменная, которую я положил Back.Back(). –

Смежные вопросы