簡體   English   中英

Python-Social-Auth在mongoEngine(Django)上失敗

[英]Python-Social-Auth fails with mongoEngine (Django)

我嘗試使python-social-authmongodb

我按照此處的說明添加:

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',則不會有與social-auth連接的數據庫。 如果我離開它,代碼將失敗。

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']

我是否想添加一些東西? 我該如何解決?

我正在嘗試此操作,似乎AUTH_USER_MODEL的默認值導致錯誤,默認值為auth.User ,它引用django.contrib.auth.models.User 但是將其定義為mongoengine.django.auth.User會使django抱怨格式不是app_name.ModelName

定義SOCIAL_AUTH_USER_MODEL = 'mongoengine.django.auth.User'解決了此問題。

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的Custom User Model告訴Django使用另一個模型的一種方式。 此模型的管理者將僅返回由MONGOENGINE_USER_DOCUMENT定義的MONGOENGINE_USER_DOCUMENT文檔,如上所述。

不幸的是,python-social-auth不支持此方法,因為它希望AUTH_USER_MODEL是MongoEngine文檔,而實際上它是Django代理模型。

我創建了一個“ 拉取請求”以嘗試解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM