1

我尝试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']

我错过了要添加的内容吗?我该如何解决?

4

2 回答 2

0

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'。如果要编写自定义用户类,可以更新此值。

然后,正如 omab 指出的那样,只需为 Social-Auth 设置相同的用户文档类即可:

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(使用 Django 的app_name.model_name符号)。

这个MongoUser模型不是直接使用的(因为它是一个 Django 模型),它只是告诉 Django 使用另一个模型的一种方式,使用 Django 的自定义用户模型。此模型上的管理器将简单地返回上述定义的 MongoEngine 文档MONGOENGINE_USER_DOCUMENT

不幸的是,python-social-auth 不支持这种方法,因为它期望AUTH_USER_MODEL是一个 MongoEngine 文档,而它实际上是一个代理 Django 模型。

我创建了一个Pull Request来尝试解决这个问题。

于 2013-12-26T09:35:52.897 回答
0

我自己尝试过这个,似乎默认值AUTH_USER_MODEL导致错误,默认值是auth.Userwhich refs to django.contrib.auth.models.User。但是将其定义为mongoengine.django.auth.User使 django 抱怨格式不是app_name.ModelName.

定义SOCIAL_AUTH_USER_MODEL = 'mongoengine.django.auth.User'解决了问题。

于 2013-09-22T21:55:50.603 回答