按照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,则服务器会运行,但社交身份验证无法正常工作,因为如果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_MODEL
和AUTH_USER_MODEL
,但我不确定MongoEngine是否需要AUTH_USER_MODEL
设置。我没有测试它。