将Social Auth连接到MongoEngine模型会产生错误

时间:2013-08-30 18:34:33

标签: python django django-models mongoengine django-socialauth

按照MongoEngineSocial Auth文档中的说明对我的 settings.py 文件进行必要的修改后,我最后添加了此代码:

    AUTH_USER_MODEL = 'mongo_auth.MongoUser'
    SOCIAL_AUTH_MODELS = 'social_auth.db.mongoengine_models'

尝试运行服务器后出现此错误:

File "/Library/Python/2.7/site-packages/social_auth/db/mongoengine_models.py", line 35,
  in <module> class UserSocialAuth(Document, UserSocialAuthMixin):
File "/Library/Python/2.7/site-packages/social_auth/db/mongoengine_models.py", line 37, in UserSocialAuth
  user = ReferenceField(USER_MODEL, dbref=True)
File "/Library/Python/2.7/site-packages/mongoengine/fields.py", line 837, in __init__
  self.error('Argument to ReferenceField constructor must be a '
File "/Library/Python/2.7/site-packages/mongoengine/base/fields.py", line 125, in error
  raise ValidationError(message, errors=errors, field_name=field_name)
  mongoengine.errors.ValidationError: Argument to ReferenceField constructor must be a
  document class or a string

如果我删除了SOCIAL_AUTH_MODELS,则服务器会运行,但社交身份验证无法正常工作,因为如果MongoEngine出现故障,它就没有任何引擎。

MongoEngine的版本:0.8.3

我找不到解决方案。我该如何解决这个问题?


解决方案:

如果查看social_auth.db.mongoengine_models.py,您会看到USER_MODEL_APP将设置为模型,而不是文档。该模型定义为mongo_auth.MongoUser。因为ReferenceField需要Document而不是Model(MongoUser),所以我不得不忽略if语句并将USER_MODEL设置为User文档(mongo.django.auth.User),因为它是已经写在else声明中。我只用那两行删除了替换的if和else语句:

USER_MODEL_MODULE, USER_MODEL_NAME = 'mongoengine.django.auth.User'.rsplit('.', 1)
USER_MODEL = getattr(import_module(USER_MODEL_MODULE), USER_MODEL_NAME)

另一种方法是从设置中删除SOCIAL_AUTH_USER_MODELAUTH_USER_MODEL,但我不确定MongoEngine是否需要AUTH_USER_MODEL设置。我没有测试它。

0 个答案:

没有答案