2014-04-04 46 views
8

我想用我的mongoengine db在我的Django項目中處理身份驗證。Django - 使用mongoengine進行身份驗證DB

我嘗試了幾個關於這個東西的例子回答了老問題,但它沒有運行。我使用的是Django 1.6和mongoengine。一切都已安裝,正在運行,我可以創建文檔並將其保存到我的Mongoengine數據庫。

我下面http://mongoengine-odm.readthedocs.org/en/latest/django.html

,我得到以下錯誤:

當我運行:

>>> from django.contrib.auth.models import User 
>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword') 

我得到這個:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/REBORN/reb_env/local/lib/python2.7/site-packages/django/db/models/manager.py", line 273, in __get__ 
    self.model._meta.object_name, self.model._meta.swapped 
AttributeError: Manager isn't available; User has been swapped for 'mongo_auth.MongoUser' 
>>> 

我真不」理解2件事:

- 我必須創建並定義用戶將被存儲在哪個數據庫,否則他們將自動創建?

- 什麼是經理?我還沒有定義任何經理的東西

在開始我認爲寄存器被保存在一個分貝。叫做'mongo_auth.MongoUser',但它並沒有將它保存在任何地方。

這裏是機型:

# Create your models here. 
from mongoengine import * 

class Profile(Document): 
    email = StringField(required=True) 
    first_name = StringField(max_length=50) 
    last_name = StringField(max_length=50) 

class auth_user(Document): 
    username = StringField(max_length=50) 
    email = StringField(max_length=50) 
    password = StringField(max_length=50) 

的settings.py的手冊上說的配置是否正確。

編輯@cestDiego:

我的設置是完全一樣的,我注意到有關DB後端,因爲它創造了我,因爲我用蒙戈...反正我是從尤斯這沒興趣數據庫mongoengine.django.auth導入用戶,但現在當我嘗試創建一個用戶,它返回我:

>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword') 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'QuerySet' object has no attribute 'create_user' 

也許我們定製身份驗證,這就是爲什麼不行,不知道。你也有這個問題嗎?

第二個編輯:

我讀,我們必須使用Django的權威性,後配置正確的設置,既是我們已經做了。

然後必須導入django.contrib.auth導入驗證並使用驗證,因爲它在Django文檔中提供,希望有所幫助; D。

from django.shortcuts import render 
# Create your views here. 
from django.http import HttpResponse 
from game.models import * 
from mongoengine import * 
from models import User 
from django.contrib.auth import authenticate 

def login(request): 
     user = authenticate(username='john', password='secret') 
     if user is not None: 
      # the password verified for the user 
      if user.is_active: 
       print("User is valid, active and authenticated") 
      else: 
       print("The password is valid, but the account has been disabled!") 
     else: 
      # the authentication system was unable to verify the username and password 
      print("The username and password were incorrect.") 

回答

6

我解決問題

在Django的1.6 ...

我的settings.py看起來是這樣的:

""" 
Django settings for prova project. 

For more information on this file, see 
https://docs.djangoproject.com/en/1.6/topics/settings/ 

For the full list of settings and their values, see 
https://docs.djangoproject.com/en/1.6/ref/settings/ 
""" 

# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 


# Quick-start development settings - unsuitable for production 
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ 

# SECURITY WARNING: keep the secret key used in production secret! 
SECRET_KEY = '^%r&tw5_steltu_ih&n6lvht0gs(0p#[email protected]+#l1o(iz_t6' 

# SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = True 

TEMPLATE_DEBUG = True 

ALLOWED_HOSTS = [] 


# Application definition 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.sessions', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
) 

ROOT_URLCONF = 'prova.urls' 

WSGI_APPLICATION = 'prova.wsgi.application' 


# Database 
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.dummy' 
    } 
} 
AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend', 
) 
SESSION_ENGINE = 'mongoengine.django.sessions' 
SESSION_SERIALIZER = 'mongoengine.django.sessions.BSONSerializer' 
# Internationalization 
# https://docs.djangoproject.com/en/1.6/topics/i18n/ 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 


# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.6/howto/static-files/ 

STATIC_URL = '/static/' 

和我的看法。 py的樣子:

from django.shortcuts import render 
# Create your views here. 
from django.http import HttpResponse 
from game.models import * 
from mongoengine import * 
#from django.contrib.auth import authenticate 
from mongoengine.django.auth import User 

def login(request): 
    connect('reborn') 
    from django.contrib.auth import login 
    from mongoengine.django.auth import User 
    from mongoengine.queryset import DoesNotExist 
    from django.contrib import messages 
    try: 
     user = User.objects.get(username='bob')#request.POST['username']) 
     if user.check_password('bobpass'):#request.POST['password']): 
      user.backend = 'mongoengine.django.auth.MongoEngineBackend' 
      print login(request, user) 
      request.session.set_expiry(60 * 60 * 1) # 1 hour timeout 
      print "return" 
      return HttpResponse("LOGUEJAT")#redirect('index') 
     else: 
      print "malament" 
      messages.add_message(request,messages.ERROR,u"Incorrect login name or password !") 
    except DoesNotExist: 
     messages.add_message(request,messages.ERROR,u"Incorrect login name or password !") 
    return render(request, 'login.html', {}) 

def logout(request):#NOT TESTED 
    from django.contrib.auth import logout 
    logout(request) 
    return redirect('login') 

def createuser(request): 
    connect('reborn') 
    User.create_user('boba','bobpass','[email protected]') 
    return HttpResponse("SAVED") 

現在的用戶對象保存在數據庫,如:

{ 
    "_id" : ObjectId("53465fa60f04c6552ab77475"), 
    "_cls" : "User", 
    "username" : "boba", 
    "email" : "[email protected]", 
    "password" : "pbkdf2_sha256$12000$ZYbCHP1K1kDE$Y4LnGTdKhh1irJVktWo1QZX6AlEFn+1daTEvQAMMehA=", 
    "is_staff" : false, 
    "is_active" : true, 
    "is_superuser" : false, 
    "last_login" : ISODate("2014-04-10T09:08:54.551Z"), 
    "date_joined" : ISODate("2014-04-10T09:08:54.550Z"), 
    "user_permissions" : [ ] 
} 
+0

我在此行中收到錯誤 user.backend ='mongoengine.django.auth.MongoEngineBackend' 錯誤是'MetaDict'對象有沒有屬性'PK' –

6

嘿,我現在和你一樣。正如我可以計算出你在settings.py

AUTH_USER_MODEL = 'mongo_auth.MongoUser' 
MONGOENGINE_USER_DOCUMENT = 'mongoengine.django.auth.User' 

有這些而這在安裝的應用程序

'mongoengine.django.mongo_auth' 

這意味着現在您正在使用的Mongoengine驗證方法,第一行你使用導入的DJANGO認證方法,所以存在這個問題。您不是在mongodb中創建任何數據庫,而是在Django的ORM中使用backend.dummy創建的虛擬數據庫。

我不知道如何使用mongoengine的auth方法,如果你想出來請給我解釋;)我希望我澄清一下我們在這裏面臨的問題。這只是一個更深入地閱讀文檔的問題。

編輯:(答案後1分鐘) 我的文檔中發現了這一點,你鏈接到:

MongoEngine includes a Django authentication backend, which uses MongoDB. >The User model is a MongoEngine Document, but implements most of the >methods and attributes that the standard Django User model does - so the >two are moderately compatible.

這樣就意味着你的情況,交換

from django.contrib.auth import User 

from mongoengine.django.auth import User 
1

我無法重現您收到的錯誤消息@Bugfixer。我假設這是因爲您的設置上設置了AUTH_USER_MODEL,因此只有在您擁有自定義用戶模型時,此條目才應該在您的設置中。

會盡量把這個答案正是我所做的,使之與我添加收藏夾陣列自定義用戶模式運行:

settings.py

from mongoengine import * 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.dummy', 
    } 
} 

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend', 
    ... 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'mongoengine.django.mongo_auth', 
    .... 
) 

SESSION_ENGINE = 'mongoengine.django.sessions' 

AUTH_USER_MODEL=('mongo_auth.MongoUser') 
MONGOENGINE_USER_DOCUMENT = 'MyAwesomeApp.app.models.CustomUser' 

模型的.py

from mongoengine.django.auth import User 
from mongoengine import * 

class CustomUser(User): 

    """Extend mongoengine User model""" 
    favorites = ListField(ReferenceField(MyReferencedModel, dbref=False)) 

    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS =() #must be list or tuple 

    def toJSON(self): 
     fav_list = [] 

     for f in self.favorites:     
      fav_list.append(f.toJSON()) 

     userJSON = {} 
     userJSON['id'] = str(self.pk) 
     userJSON['favorites'] = fav_list 
     userJSON['email'] = str(self.email) 
     userJSON['last_name'] = str(self.last_name) 
     userJSON['first_name'] = str(self.first_name) 
     userJSON['username'] = str(self.username) 
     return simplejson.dumps(userJSON) 

views.py

from MyAwesomeApp.app.models import CustomUser 

#util 
def extractDataFromPost(request): 
    rawData = request.body.replace('false', 'False') 
    rawData = rawData.replace('true', 'True') 
    rawData = rawData.replace('null', 'None') 
    return eval(rawData) 

#util 
def jsonResponse(responseDict): 
    return HttpResponse(simplejson.dumps(responseDict), mimetype='application/json') 

def createUser(request): 
    data = extractDataFromPost(request) 

    email = data["email"] 
    password = data["password"] 
    user_type = data["user_type"] 

    try: 
     user = CustomUser.objects.get(username=email) 
     return jsonResponse({'error':True, 'message': 'Email já cadastrado'}) 
    except CustomUser.DoesNotExist: 
     user = CustomUser.create_user(email, password, email) 
     user.favorites = [] 
     user.save() 
     user = authenticate(username=email, password=password) 
     user.backend = 'mongoengine.django.auth.MongoEngineBackend' 
     login(request, user) 
     request.session.set_expiry(3600000) # 1 hour timeout 
     del user.password 
     return HttpResponse(simplejson.dumps(user.toJSON())) 

讓我知道你是否有任何問題。

問候

+0

安德烈嗨,它給了我,「廣告」(在models.py)沒有定義,我無法弄清楚什麼它是。 – BugFixer

+0

這只是一個模型的例子。用一個更簡單的名字編輯答案。 o/ –

+0

你爲什麼試着用mongoengine auth開始?您是否嘗試過使用包含在Django中的auth,以及Django ORM本身? ORM實際上與MongoDB兼容...嘗試搜索:** Djongo ** – nesdis