0

在按照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,服务器会运行,但 Social Auth 无法工作,因为如果 MongoEngine 出现故障,它没有任何引擎。

MongoEngine 的版本:0.8.3

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


解决方案:

如果您查看social_auth.db.mongoengine_models.py,您会看到USER_MODEL_APP它将被设置为模型,而不是文档。该模型定义为mongo_auth.MongoUser。因为 ReferenceField 需要一个文档,而不是模型(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_MODEL和删除,AUTH_USER_MODEL但我不确定 MongoEngine 是否需要AUTH_USER_MODEL设置。我没有测试它。

4

0 回答 0