【问题标题】:Registration Facebook user with Django Allauth使用 Django Allauth 注册 Facebook 用户
【发布时间】:2024-04-24 15:05:01
【问题描述】:

我尝试使用 Django AllAuth 通过 Facebook 注册用户。

我必须制作一个 REST API,所以我会使用 Django REST Framework。

我发现这个简单的tutorial 来进行第一个用户注册,但可能与当前的实现有些不同:

我试过这段代码:

def post(self, request):
        data = JSONParser().parse(request)
        access_token = data.get('access_token', '')

        try:
            app = SocialApp.objects.get(provider="facebook")
            token = SocialToken(app=app, token=access_token)

            # check token against facebook
            login = fb_complete_login(app, token)
            login.token = token
            login.state = SocialLogin.state_from_request(request)

            # add or update the user into users table
            ret = complete_social_login(request, login)

            # if we get here we've succeeded
            return Response(status=200, data={
                'success': True,
                'username': request.user.username,
                'user_id': request.user.pk,
            })

        except:

            traceback.print_exc()
            return Response(status=401, data={
                'success': False,
                'reason': "Bad Access Token",
            })

但现在我看到 fb_complete_login 采用 3 个参数:requestapptoken

因此,我尝试将请求也像此函数参数一样放入,但稍后我在 login = fb_complete_login(app, token) 上出现错误。

TypeError: add_message() 参数必须是 HttpRequest 对象,而不是 '请求'。

欢迎提出任何建议!

【问题讨论】:

  • 它试图将 Django 的消息传递系统与 Django Rest Framework 请求对象(“请求”)一起使用,而不是它所期望的 HttpRequest 对象。我有类似的问题,不确定这是配置还是错误。作为快速修复,您可以在 settings.py 中禁用“django.contrib.messages”。

标签: python django facebook django-rest-framework django-allauth


【解决方案1】:

这里给出的解决方案:http://tech.agilitynerd.com/django-rest-registration-with-django-rest-auth.html

要仅为 allauth 禁用消息传递,请覆盖适配器(例如在 main.adapters 中):

from allauth.account.adapter import DefaultAccountAdapter

class MessageFreeAdapter(DefaultAccountAdapter):
    def add_message(self, request, level, message_template,
                        message_context=None, extra_tags=''):
        pass

然后在 settings.py 中添加:

ACCOUNT_ADAPTER = 'main.adapters.MessageFreeAdapter'

【讨论】:

  • 我正在使用相同的教程并尝试了指定的修复,但我仍然收到错误 - fb_complete_login 采用 3 个参数:请求、应用程序和令牌。