2012-03-25 3 views
0

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

def start_serial(): 
    rfmon = threading.Thread(target=rf_clicker.RFMonitor().run) 
    rfmon.daemon = True 
    rfmon.start() 

start_serial() 

петля внутри этого подтему ссылается на глобальную переменную, определенную в global_vars.py. Я хотел бы изменить значение этой переменной в представлении, но он, похоже, не работает.

из views.py:

import global_vars 

def my_view(request): 
    global_vars.myvar = 2 
    return httpResponse... 

Как может позволить функцию внутри цикла знают, что этот вид был назван?

Цикл прослушивает сигнал с пульта дистанционного управления и на основе нажатия кнопок может сохранять данные в базе данных. В веб-интерфейсе есть несколько видов, которые изменяют настройки для пультов. Хотя эти параметры изменяются, состояние внутри цикла должно быть таким, чтобы данные не сохранялись.

+2

Вы никогда не хотите использовать глобальные переменные для хранения состояния в приложении Django; есть слишком много способов, чтобы они не работали. –

ответ

2

Я согласен с Ignacio Vazquez-Abrams, не используйте глобалам. Особенно в вашем случае использования. Проблема с этим подходом заключается в том, что при развертывании приложения в контейнере wsgi или у вас есть несколько экземпляров приложения, работающих в разных процессах, поэтому изменение глобальной переменной в одном процессе не изменит ее в других ,

А я бы также не рекомендовал использовать потоки. Если вам нужен длительный процесс, который обрабатывает задачи асинхронно (что, кажется, имеет место), рассмотрите вопрос о сельдерее (http://celeryproject.org/). Это действительно хорошо.

+0

Спасибо за объяснение. В этом случае я установил uwsgi для запуска только одного работника. Это приложение предназначено для локальной настройки и, вероятно, никогда не будет иметь более одного клиента, подключенного в любой момент времени. Я кратко взглянул на Сельдерей, но я не видел, как использовать его с демоном, который следит за последовательным портом. – AgDude

1

Я признаю, что у меня нет опыта в их использовании, но если вы не посмотрели на возможности передачи сообщений Django, кажется, что они будут основным кандидатом на этот вид деятельности (и более подходящим, чем глобальные переменные).

https://docs.djangoproject.com/en/dev/ref/signals/

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