Lambda自我运作

时间:2019-02-28 13:29:12

标签: python django

我正在遍历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函数,却不能设置用户对象。 有人请解释

1 个答案:

答案 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在自定义中间件中访问用户。