如何向请求添加属性,例如“用户”变量

Jan*_*ngo 5 django

我想创建一个始终可用的新变量,就像“用户”变量的工作方式一样。

这是我的 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}
Run Code Online (Sandbox Code Playgroud)

问题是,它总是打印“假”。看来我无法向请求添加属性,也无法创建始终可用的变量。顺便说一句,我已将此 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',
        ],
    },
},
Run Code Online (Sandbox Code Playgroud)

]

编辑:阅读源代码后,似乎该user变量实际上并不是创建一次并永远存在。中间件和 context_processoruser为每个请求添加一个变量,并且这个“用户”实际上是从会话中提取的。

我最初的设计是:一旦选择了一个病人,接下来的所有页面都是关于这个病人的。因此,我想让该患者的 ID 始终可用。我不想到处传递这个 ID,而是想将其保存(某处)一次并始终可用,直到选择另一个患者为止。

然而现在,考虑到变量的复杂性user,我可能会放弃这种花哨的方式。只需将此 id 作为参数放在每个请求 url 中应该会更容易。

Wil*_*sem 4

Django 使用中间件\xc2\xa0 [Django-doc]来做到这一点。事实上,设置.user属性也是通过中间件完成的。事实上,您可以在AuthenticationMiddleware\xc2\xa0 [GitHub]中看到这一点:

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

\'django.contrib.auth.middleware.AuthenticationMiddleware\'如果从MIDDLEWARE设置\xc2\xa0 [Django-doc]中删除字符串,则request.user不再设置。

\n

因此,您可以实现自己的中间件。例如:

\n
# app/middleware.py\n\nfrom django.utils.deprecation import MiddlewareMixin\n\nclass PatientSelectIdMiddleware(MiddlewareMixin):\n    \n    def process_request(self, request):\n        if not hasattr(request, \'patient_selected_id\'):\n            request.patient_selected_id = 0
Run Code Online (Sandbox Code Playgroud)\n

接下来,您需要将\'app.PatientSelectIdMiddleware\'中间件添加到MIDDLEWARE设置中。

\n