📜  django allauth 在 request.user 中获取额外数据 - Python (1)

📅  最后修改于: 2023-12-03 15:00:26.252000             🧑  作者: Mango

Django allauth 在 request.user 中获取额外数据

Django allauth 是 Django 社区中广受欢迎的第三方库,用来实现用户身份验证和社交媒体登录集成。在 request.user 对象中,可以获取到用户的一些基本信息,但有时我们需要获取到更多的数据。那么该如何在 request.user 中获取额外的数据呢?

以下是一些常见的方法:

1. 使用 user 对象的 profile 属性

Django 中的常见做法是,将用户的额外信息存储在一个 profile 模型中,该模型与 User 模型通过一对一关系建立联系。我们可以通过 user.profile 的方式在 request.user 对象中获取到这些额外信息。例如:

from django.contrib.auth.decorators import login_required

@login_required
def myview(request):
    print(request.user.profile.my_extra_data)

但如果我们使用了 allauth 的社交登录集成功能,该方法就无法使用了,因为 allauth 不会自动为社交登录用户创建 profile 对象。

2. 自定义 adapter

为了获取社交登录用户的个人信息,一种可能的做法是自定义 allauth 的 adapter,并覆盖其中的一些方法。这里我们以 Facebook 为例:

from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter

class MyFacebookOAuth2Adapter(FacebookOAuth2Adapter):
    def complete_user(self, request, app, token, **kwargs):
        user = super(MyFacebookOAuth2Adapter, self).complete_user(request, app, token, **kwargs)
        profile_url = 'https://graph.facebook.com/v3.2/me?fields=id,email,name,first_name,last_name,picture.width(300).height(300)&access_token=' + token.token
        response = requests.get(profile_url)
        extra_data = response.json()
        user.email = extra_data['email']
        user.first_name = extra_data['first_name']
        user.last_name = extra_data['last_name']
        user.save()
        return user

在这个例子中,我们覆盖了 FacebookOAuth2Adapter 的 complete_user() 方法,向 Facebook Graph API 发送一个请求获取用户的额外资料,并将其保存到 User 模型中。注意,这个方法需要返回 User 对象。

然后在 settings.py 中指定我们自定义的 adapter:

SOCIALACCOUNT_ADAPTER = 'myapp.adapters.MyFacebookOAuth2Adapter'

经过这样的配置,我们在 request.user 中就可以获取到所需的额外信息了。

3. 使用信号

还有一种方法是,利用 allauth 提供的信号来获取用户登录成功后的信息。在 settings.py 中,可以监听 user_signed_in 信号并定义一个处理函数:

from allauth.account.signals import user_signed_in
from django.dispatch import receiver

@receiver(user_signed_in)
def handle_user_signed_in(sender, request, user, **kwargs):
    if user.is_authenticated:
        # do something with request and user objects

处理函数中的参数包括发送信号的对象 sender、请求 request、用户 user 等等,通过它们,我们可以获取到用户登录成功后的信息。这种方法的优点是可定制性高,可以针对不同的情况制定不同的处理方式。

总的来说,以上这些方法都可以用来在 request.user 中获取额外数据,但具体采用哪种方法,还需要视情况而定。