在按照MongoEngine和Social 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
设置。我没有测试它。