Как добавить атрибут к запросу как переменную 'user' - PullRequest
2 голосов
/ 19 октября 2019

Я хочу создать новую переменную, которая всегда доступна, например, как работает переменная 'user'.

Вот мой myapp / context_processors.py

def patient_selected(request):

print(hasattr(request, 'patient_selected_id'))
print( 'patient_selected_id' in locals())
print( 'patient_selected_id' in globals())

if not hasattr(request, 'patient_selected_id'):
    request.patient_selected_id = 0

return {"patient_selected_id": 0}

Проблема в том,это всегда печатает «ложь». Кажется, что я не могу ни добавить атрибут к запросу, ни создать постоянную переменную. Кстати, я добавил этот context_processors.py в настройки. Вот мои настройки:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'hrs.context_processors.patient_selected',
        ],
    },
},

]

РЕДАКТИРОВАТЬ: После чтения исходных кодов, похоже, что переменная user на самом деле не создается один раз и жить вечно. Промежуточное ПО и context_processor добавляют переменную user для каждого запроса, и этот «пользователь» фактически извлекается из сеанса.

Мой оригинальный дизайн: После выбора пациента все следующие страницы будут об этом пациенте. ,Таким образом, я хотел бы сделать идентификатор этого пациента всегда доступным. Вместо того, чтобы передавать этот идентификатор, я хочу сохранить его (где-то) один раз и всегда доступным, пока не будет выбран другой пациент.

Однако теперь, учитывая сложность переменной user, я могу отказаться от причудливого пути. Просто укажите этот идентификатор в качестве параметра в каждом URL-адресе запроса.

1 Ответ

0 голосов
/ 20 октября 2019

Django делает это с middleware [Django-doc] . Фактически установка атрибута .user также выполняется с помощью промежуточного программного обеспечения. Действительно, вы можете увидеть это в AuthenticationMiddleware [GitHub] :

class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        assert hasattr(request, 'session'), (
            "The Django authentication middleware requires session middleware "
            "to be installed. Edit your MIDDLEWARE%s setting to insert "
            "'django.contrib.sessions.middleware.SessionMiddleware' before "
            "'django.contrib.auth.middleware.AuthenticationMiddleware'."
        ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")
        <b>request.user =</b> SimpleLazyObject(lambda: get_user(request))

Если вы удалите строку 'django.contrib.auth.middleware.AuthenticationMiddleware'из настройки MIDDLEWARE [Django-doc] , тогда request.user больше не будет устанавливаться.

Таким образом, вы можете реализовать свое собственное промежуточное ПО. Например, с помощью:

# app/middleware.py

from django.utils.deprecation import MiddlewareMixin

class PatientSelectIdMiddleware(MiddlewareMixin):

    def process_request(self, request):
        if not hasattr(request, 'patient_selected_id'):
            request.patient_selected_id = 0

Далее необходимо добавить промежуточное ПО 'app.PatientSelectIdMiddleware' в настройку MIDDLEWARE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...