Глобальные Переменные Python Django

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

Я не хочу, чтобы переменные были связаны с пользователем или сеансом, потому что я могу захотеть вернуть эти подсчеты без входа в систему (и я хочу, чтобы подсчеты были согласованными независимо от того, какой пользователь вошел в систему). Я описываю глобальную переменную? Если да, то как использовать его в Django? Я заметил файлы, такие как urls.py, settings.py и models.py кажется, анализируется только один раз при запуске сервера (в отличие от views.py который, кажется, анализируется eache время запроса). Означает ли это, что я должен объявить свои переменные в одном из этих файлов? Или я должен каким-то образом хранить его в атрибуте модели (пока он держится, пока сервер работает)? Это, вероятно, простой вопрос, но я просто не уверен, как это делается в Джанго.

какие-либо замечания или совет очень ценится. Спасибо, Джо!--1-->

2 ответов


вы не объявлять глобальные переменные. Настройки (константы) в порядке, если все сделано правильно. Но переменные нарушают с shared-ничего архитектура и может вызвать много неприятностей. (в лучшем случае они будут несовместимы)

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

новый incr() и decr() методы особенно подходят для подсчета. См. docs для получения дополнительной информации.


почему один не объявлять глобальные переменные? O_o. Это выглядит как пропаганда. Если автор знает, чего он хочет и какие будут побочные эффекты, почему бы и нет. Может, это просто быстрый эксперимент.

вы можете объявить свой счетчик как модель класс-член. Тогда бороться с гонки вы должны добавить метод, который будет ждать, если какой-то другой клиент, из другого потока работ со счетчиком. Что-то вроде этого:--5-->

import threading

class MyModel(ModelBase):
    _counter = 0
    _counter_lock = threading.Lock()

    @classmethod
    def increment_counter(cls):
        with cls._counter_lock:
            cls._counter += 1

    def some_action(self):
        # core code
        self.increment_counter()


# somewhere else
print MyModel._counter

запомнить однако: вы должны иметь свое приложение в одном процесс. Поэтому, если вы развернули приложение под Apache, убедитесь, что оно настроено для создания многих потоков, но не многих процессов. Если вы экспериментируете с ./manage.py run никаких действий не требуется.