gpt4 book ai didi

django - 如何向请求添加属性,如 'user' 变量

转载 作者:行者123 更新时间:2023-12-04 13:00:25 25 4
gpt4 key购买 nike

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

这是我的 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变量实际上并不是创建一次就永远存在。 Middleware 和 context_processor 添加一个变量 user对于每个请求,这个“用户”实际上是从 session 中提取的。

我的原始设计是:一旦选择了患者,接下来的所有页面都将是关于该患者的。因此,我想让该患者的 ID 始终可用。我不想将这个 id 到处传递,而是想将它(某处)保存一次,并且在选择另一个患者之前始终可用。

但是现在,考虑到 user 的复杂性变量,我可能会放弃花哨的方式。简单地将此 id 作为参数放在每个请求 url 中应该更容易。

最佳答案

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 "")
request.user = SimpleLazyObject(lambda: get_user(request))


如果删除 'django.contrib.auth.middleware.AuthenticationMiddleware'来自 MIDDLEWARE setting [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环境。

关于django - 如何向请求添加属性,如 'user' 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58467330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com