def get(self, request, *args, **kwargs): template_html = 'account/login.html' # 如果申请登陆页面成功后,就会返回code和state if 'code' not in request.GET: return render(request, template_html) code = request.GET('code') # 第二步 # 将得到的code,通过下面的url请求得到access_token url = 'https://github.com/login/oauth/access_token' data = { 'grant_type': 'authorization_code', 'client_id': settings.GITHUB_CLIENTID, 'client_secret': settings.GITHUB_CLIENTSECRET, 'code': code, 'redirect_uri': settings.GITHUB_CALLBACK, } # 请求参数需要bytes类型 binary_data = urlencode(data).encode('utf-8') # 设置请求返回的数据类型 headers = {'Accept': 'application/json'} req = Request(url, binary_data, headers) # json是str类型的,将bytes转成str result = json.loads(urlopen(req).read().decode('utf-8')) access_token = result['access_token'] url2 = 'https://api.github.com/user?access_token=%s' % (access_token) response = json.loads(urlopen(url2).read().decode('utf-8')) print(response) username = '******' + str(response['id']) password = '******' # 如果不存在username,则创建 try: user = User.objects.get(username=username) except: user = User.objects.create_user(username=username, password=password) user.save() user_signed_up.send(sender=self, request=request, user=user) # 登陆认证 user = auth.authenticate(username=username, password=password) auth.login(request, user, backend=None) user_logged_in.send(sender=self, request=request, user=user) return super().get(self, request, *args, **kwargs)
def test_logged_in(self): """Test the user-logged-in Allauth signal handling.""" mock_obj = mock.Mock() with mock.patch.object(AllauthSignalListener, "_apply_groups", mock_obj): AllauthSignalListener() # Don't attempt to apply groups if the user doesn't have a linked Discord account user_logged_in.send(DjangoUser, user=self.django_user_discordless) mock_obj.assert_not_called() # Don't attempt to apply groups if the user hasn't joined the Discord server user_logged_in.send(DjangoUser, user=self.django_user_never_joined) mock_obj.assert_not_called() # Attempt to apply groups if everything checks out user_logged_in.send(DjangoUser, user=self.django_user) mock_obj.assert_called_with(self.discord_user, self.social_user)
def test_user_logged_in(self): Profile.objects.get(user=self.user).delete() with patch('django_mailman3.signals.sync_email_addresses') as sea: user_logged_in.send(sender=User, user=self.user) self.assertEqual(sea.call_args_list, [call(self.user)]) self.assertTrue(Profile.objects.filter(user=self.user).exists())