Я выполнил основные документы по установке allauth, поэтому у меня есть базовая система Google, Facebook и система имени пользователя/пароля, работающая нормально. Что я хотел бы сделать сейчас, так это автоматически связать социальные учетные записи с существующей учетной записью имени пользователя и пароля, когда пользователь пытается войти в систему с помощью ссылки на социальную учетную запись.
На эту тему уже есть много сообщений, таких как это и это, но я довольно рано застрял в процесс.
Согласно этим другим сообщениям, я создал класс, который переопределяет DefaultSocialAccountAdapter, и назвал его SocialAccountAdapter. Затем я добавил его в качестве параметра конфигурации в файл settings.py (где my_app — это имя моего приложения внутри INSTALLED_APPS):
ACCOUNT_ADAPTER = 'my_app.adapter.SocialAccountAdapter'
Рассматриваемый класс выглядит следующим образом.
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
class SocialAccountAdapter(DefaultSocialAccountAdapter):
def pre_social_login(self, request, sociallogin):
pass
... другими словами, он не должен делать ничего, кроме родительского класса. Проблема в том, что я получаю ошибки на странице /accounts/login/.
Файл ".../site-packages/allauth/account/utils.py", строка 41, в get_next_redirect_url, если не get_adapter(request).is_safe_url(redirect_to): AttributeError: объект "SocialAccountAdapter" не имеет атрибута "is_safe_url"
Итак, чтобы «исправить» это, я добавил в класс SocialAccountAdapter следующее:
def is_safe_url(self, url):
from django.utils.http import is_safe_url
return is_safe_url(url)
... но при использовании формы по умолчанию для ввода имени пользователя и пароля на странице учетных записей / входа в систему я получаю следующую ошибку.
Файл ".../site-packages/allauth/account/forms.py", строка 157, в чистом user = get_adapter(self.request).authenticate( AttributeError: объект SocialAccountAdapter не имеет атрибута "authenticate"
Если я попытаюсь перейти по одной из ссылок для входа в социальную сеть, например:
{% provider_login_url provider.id openid=brand.openid_url process=process %})
... Я получаю следующую ошибку.
Файл ".../site-packages/allauth/socialaccount/adapter.py", строка 68, в new_user return get_account_adapter().new_user(request) TypeError: new_user() принимает ровно 3 аргумента (2 задано)
Есть ли какая-то базовая процедура настройки, которую я пропустил? Согласно документам, это должно быть простое переопределение, но что-то еще происходит за кулисами, чего я не понимаю, и вынуждает меня добавлять код, который я не ожидал учитывать.