我正在遍历github项目,以在django
项目中获取当前请求用户,但我看到了此代码,但我不理解在此代码中使用lambda。
有人请解释一下。
def _do_set_current_user(user_fun):
setattr(_thread_locals, USER_ATTR_NAME, user_fun.__get__(user_fun, local))
class ThreadLocalUserMiddleware(object):
..........
................
_do_set_current_user(lambda self: getattr(request, 'user', None))
def get_current_user():
current_user = getattr(_thread_locals, USER_ATTR_NAME, None)
if callable(current_user):
return current_user()
return current_user
在这里我无法理解user_fun.__get__(user_fun, local)
在此行中的用途
setattr(_thread_locals, USER_ATTR_NAME, user_fun.__get__(user_fun, local))
。
相反,我们可以像这样设置attr
setattr(_thread_locals, USER_ATTR_NAME, user)
在这里,为什么使用lamda函数,却不能设置用户对象。 有人请解释
答案 0 :(得分:0)
也许我遗漏了一些东西,但是如果您只希望请求的当前用户,则在视图函数中使用request.user
或在基于类的视图中使用self.request.user
。
您可以检查用户是否通过request.user.is_authenticated
进行了身份验证。
这是由AuthenticationMiddleware
设置的。
文档:https://docs.djangoproject.com/en/2.1/ref/request-response/#attributes-set-by-middleware
如果您的用户在django.contrib.auth.middleware.AuthenticationMiddleware
之后,也可以通过request.user
在自定义中间件中访问用户。