Django: неожиданно постоянные переменные модуля - PullRequest
0 голосов
/ 12 января 2010

Сегодня я заметил странное поведение: кажется, что в следующем примере переменная config.CLIENT остается постоянной по всем запросам - даже если представление получает совершенно другой ключ client_key, запрос, который получает клиент, выполняется только один раз (для многих запросов), а затем переменная config.CLIENT остается назначенной.

Кажется, это не проблема кэширования базы данных.

Это происходит как с mod_python, так и с тестовым сервером (переменная переназначается при перезапуске тестового сервера).

Что мне здесь не хватает?

#views.py
from my_app import config

def get_client(client_key=None):
    if config.CLIENT == None:
        config.CLIENT = get_object_or_404(Client, key__exact=client_key, is_active__exact=True)
    return config.CLIENT

def some_view(request, client_key):
    client = get_client(client_key)
    ...
    return some_response

# config.py
CLIENT = None

Ответы [ 2 ]

6 голосов
/ 12 января 2010

Несколько запросов обрабатываются одним и тем же процессом, и глобальные переменные, такие как ваш КЛИЕНТ, живут так же долго, как и процесс. Вы не должны полагаться на глобальные переменные при обработке запросов - используйте либо локальные, когда вам нужно сохранить переменную на время построения ответа, либо поместить данные в базу данных, когда что-то должно сохраняться в нескольких запросах.

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

0 голосов
/ 13 января 2010

ОК, просто чтобы сделать это немного яснее (и в ответ на комментарий Феликса), я выкладываю код, который делает то, что мне нужно. Вся проблема возникла из-за фундаментального недопонимания с моей стороны, и я прошу прощения за любую путаницу, которую я мог вызвать.

import config

# This will be called once per request/view
def init_client(client_key):
    config.CLIENT = get_object_or_404(Client, key__exact=client_key, is_active__exact=True)

# This might be called from other modules that are unaware of requests, views etc 
def get_client():
    return config.CLIENT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...