Python-Social-Auth се проваля с mongoEngine (Django)

Опитвам се да накарам python-social-auth да работи с mongodb.

Следвам инструкциите тук, които казват да добавя:

INSTALLED_APPS = (
    ...
    'social.apps.django_app.me',
    ...
)

и

SOCIAL_AUTH_STORAGE = 'social.apps.django_app.me.models.DjangoStorage'

Въпреки това нещо се обърка и получавам ImportError:

Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x101c51d50>>
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 92, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 280, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/validation.py", line 35, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 166, in get_app_errors
    self._populate()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 75, in _populate
    self.load_app(app_name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 96, in load_app
    models = import_module('.models', app_name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/social/apps/django_app/me/models.py", line 29, in <module>
    'mongoengine.django.auth.User'
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/social/utils.py", line 21, in module_member
    module = import_module(mod)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/social/utils.py", line 15, in import_module
    __import__(name)
ImportError: No module named auth

Също така в моя settings.py имам следния код. Ако коментирам 'social.apps.django_app.me',, няма да имам база данни, свързана със социалната авторизация. Ако го оставя, кодът се проваля.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'mongoengine.django.mongo_auth',

    'social.apps.django_app.default',
    'social.apps.django_app.me', # this is the line that fails
)
AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
    'django.contrib.auth.backends.ModelBackend',
    'social.backends.facebook.FacebookOAuth2',
)



# Engine stuff
SESSION_ENGINE = 'mongoengine.django.sessions'

#AUTH_USER_MODEL = 'mongo_auth.MongoUser'

MONGOENGINE_USER_DOCUMENT = 'mongoengine.django.auth.User'


_MONGODB_USER = '***'      #real stuf here
_MONGODB_PASSWD = '***'    #real stuf here
_MONGODB_HOST = '***'      #real stuf here
_MONGODB_NAME = '****'     #real stuf here
_MONGODB_DATABASE_HOST = \
    'mongodb://%s:%s@%s/%s' \
    % (_MONGODB_USER, _MONGODB_PASSWD, _MONGODB_HOST, _MONGODB_NAME)

mongoengine.connect(_MONGODB_NAME, host=_MONGODB_DATABASE_HOST)

# Auth Stuff
SOCIAL_AUTH_STORAGE = 'social.apps.django_app.me.models.DjangoStorage'
SOCIAL_AUTH_FACEBOOK_KEY = '***'        #real stuf here
SOCIAL_AUTH_FACEBOOK_SECRET = '***'     #real stuf here
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email','user_location']

Пропускам ли нещо да добавя? Как мога да го поправя?


person Diolor    schedule 22.09.2013    source източник


Отговори (2)


Аз самият се опитвах това и изглежда, че стойността по подразбиране за AUTH_USER_MODEL причинява грешки, стойността по подразбиране е auth.User, което препраща към django.contrib.auth.models.User. Но дефинирането му на mongoengine.django.auth.User кара django да се оплаква, че форматът не е app_name.ModelName.

Дефинирането на SOCIAL_AUTH_USER_MODEL = 'mongoengine.django.auth.User' решава проблема.

person omab    schedule 22.09.2013

MongoEngine предоставя два различни метода за осигуряване на удостоверяване в django:

Само първият ще работи с python-social-auth (от v0.1.17).

Класическа автентификация

По принцип просто трябва да използвате персонализиран бекенд за удостоверяване:

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
)

Не трябва да задавате AUTH_USER_MODEL, тъй като това се използва за дефиниране на персонализиран потребителски модел. Тук моделите на Django просто се игнорират.

Класът потребителски документ, използван за съхраняване на потребители, се определя от MONGOENGINE_USER_DOCUMENT, което по подразбиране е 'mongoengine.django.auth.User'. Можете да актуализирате тази стойност, ако искате да напишете своя потребителски клас.

След това е просто въпрос на задаване на същия клас потребителски документ за Social-Auth, както посочи omab:

SOCIAL_AUTH_USER_MODEL = 'mongoengine.django.auth.User'

Това е опцията, която поддържа python-social-auth.

Персонализиран потребителски модел

Django 1.5 въведе нов начин за дефиниране на персонализиран клас потребителски модел, който този метод използва. Удостоверяването ще се извърши с помощта на стандартния бекенд за удостоверяване на Django:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

AUTH_USER_MODEL трябва да бъде зададено на 'mongo_auth.MongoUser', което сочи към mongoengine.django.mongo_auth.MongoUser (използвайки нотацията app_name.model_name на Django).

Този модел MongoUser не се използва директно (тъй като е модел на Django), това е просто начин да кажете на Django да използва друг модел, използвайки Персонализиран потребителски модел. Мениджърът на този модел просто ще върне документите на MongoEngine, дефинирани от MONGOENGINE_USER_DOCUMENT както по-горе.

За съжаление, този метод не се поддържа от python-social-auth, тъй като очаква AUTH_USER_MODEL да бъде документ на MongoEngine, докато всъщност е прокси Django модел.

Създадох заявка за изтегляне, за да опитам да коригирам проблема.

person Nicolas Cortot    schedule 26.12.2013