Django 如何向请求添加属性,如';用户';变量
我想创建一个新变量,该变量始终可用,就像“用户”变量的工作方式一样 这是我的myapp/context\u processors.pyDjango 如何向请求添加属性,如';用户';变量,django,Django,我想创建一个新变量,该变量始终可用,就像“用户”变量的工作方式一样 这是我的myapp/context\u 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(re
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}
问题是,它总是打印“false”。似乎我无法向请求添加属性,也无法创建一个始终可用的变量。
顺便说一句,我已经将这个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
变量实际上并没有被创建一次并且永远存在。中间件和上下文处理器为每个请求添加一个变量user
,这个“用户”实际上是从会话中提取出来的
我最初的设计是:一旦选择了一名患者,接下来的所有页面都将是关于该患者的。因此,我希望该患者的id始终可用。我不想到处传递这个id,而是想将它保存(某个地方)一次,并始终可用,直到选择另一个患者
然而现在,考虑到user
变量的复杂性,我可能会放弃这种奇特的方式。在每个请求url中简单地将此id作为参数应该更容易。Django使用。实际上,设置.user
属性也可以通过中间件完成。事实上,您可以在以下列表中看到这一点:
接下来,您需要将
'app.patientselectivedmddleware'
中间件添加到中间件设置中。您可以使用中间件执行此操作。我在def…
行之前打印了print(hasattr(请求,'patient\u selected\u id')
。然后我只点击了“主页”和“关于”页面[除了字符串以外的空白页面]。但是,它仍然打印False
。是否应该有一些特殊的方法向请求添加属性?我想我可能会得到它。我在“AuthenticationMiddleware”中打印了print(hasattr(request,user))
,它还不断打印“False”。事实上,“user”变量是从request.session
中提取出来的,并为每个任务插入。它看起来像一个常量变量,但不是那么简单。中间件不能解决我的需要。
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 "")
request.user = SimpleLazyObject(lambda: get_user(request))
# 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