2014-12-26 3 views
0

Я объявил глобальный список feature_array, как это и затем инициализировать его в get_features(request) функции:Глобальный список показывает пустой в питона

feature_array = [] 


def get_features(request): 

    selected_product_id = request.session['product_id'] 

    all_features = Feature.objects.filter(product_id = selected_product_id) 

    global feature_array 
    feature_array = list(all_features) 

Теперь я хочу, чтобы удалить первый индекс списка в другой функции, но IndexError: list assignment index out of range появляется, хотя я инициализировал его в функции get_features. Вот как я удаляю первый индекс списка. Я предполагаю, что он получает пустой список, поэтому он не может получить доступ к первому индексу.

def process_features_ajax(request): 
    global feature_array 
    del feature_array[0] 

UPDATE

Это, как я вызвать функцию get_features(request)

(customer_comments, request) = get_features(request) 
+1

Как вы управляете сервером Django? Как называется 'get_features()'? Является ли 'process_features_ajax' расположенным в том же модуле или вы импортировали' feature_array' во второй модуль? –

+0

На самом деле, когда я запускаю свой сервер Django, все работает нормально. но когда я запускаю его на экземпляре AWS ec2, он дает мне эту ошибку. Да process_features_ajax и feature_array находятся в тех же view.py и том же модуле – Sibtain

ответ

0

Вы не можете полагаться на глобалов общего доступа, если вы работаете в разветвление модель WSGI среды.

Для обработки запросов сервер модели forking будет создавать новые дочерние процессы. Они наследуют родительскую память процесса и после форкирования глобальные глобальные переменные больше не разделяются между запросами. Не полагайтесь на глобальные переменные и вместо этого используйте процесс кэширования базы данных или памяти (memcached или redis).

+0

Что может быть альтернативой для этого? Мне нужно feature_array, чтобы сохранить изменения после удаления первого индекса – Sibtain

+0

@ user3537880: альтернативой является использование только потоковой передачи, но я не знаю, какой контейнер WSGI вы используете, и ваш код не может быть безопасным. Лучше придерживаться базы данных или кэша памяти. –

0

Как утверждает Мартинн, вы не должны использовать глобальные переменные для хранения состояния между запросами в многопроцессной среде. Помимо проблем, которые вы уже видели, существует также дополнительная проблема нескольких пользователей: очевидно, что с глобальными переменными каждый будет иметь доступ к одному и тому же значению, что не может быть прав.

Способ сделать что-то подобное в Django - это использовать сеанс. Вы уже используете его из идентификатора продукта: вы также должны хранить идентификаторы требуемых функций и изменять этот список по мере необходимости.

+0

Да, изначально я также использовал сеанс для хранения всех функций для определенного продукта. Могу ли я как-то удалить первую запись из переменной сеанса, как в списке, у меня возникают трудности с этим – Sibtain

+0

Я сделал это 'js_features = json.loads (serializers.serialize ("json", all_features)) запрос. session ['features'] = js_features ' Теперь, как я могу как-то удалить первый индекс любой функции – Sibtain

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