2014-04-04 22 views
8

Ich möchte Authentifizierungen in meinem Django-Projekt mit meiner Mongoengine db handhaben.Django - Auth mit Mongoengine DB

Ich versuchte ein paar Beispiele über dieses Zeug in alten Fragen beantwortet, aber es lief nicht. Ich benutze Django 1.6 und Mongoengine. Alles ist installiert, läuft und ich kann Dokumente in meiner Mongoengine DB erstellen und speichern.

Ich folge http://mongoengine-odm.readthedocs.org/en/latest/django.html

und ich erhalte den folgenden Fehler:

Wenn ich laufe:

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

ich dieses:

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

ich wirklich don‘ t verstehe 2 Dinge:

-Do muss ich die Datenbank erstellen und definieren, in der die Benutzer gespeichert werden, oder werden sie automatisch erstellt?

-Was ist Manager? Ich habe keine Manager Sachen definiert

Am Anfang dachte ich, dass das Register in einer Datenbank gespeichert wurde. rief 'mongo_auth.MongoUser', aber es rettete es nicht im Nirgendwo. Hier

ist die Modelle:

# 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) 

Die settings.py richtig wie das Handbuch so konfiguriert ist, sagt.

EDIT @cestDiego:

Meine Einstellungen sind genau die gleichen, ich habe über die Db Backend bemerkt, weil es mir eine Datenbank erstellt, die nicht daran interessiert bin, weil ich Mongo ... Auf jeden Fall bin ich Ussing aus mongoengine.django.auth Import Benutzer jetzt aber wenn ich versuche, einen Spieler zu schaffen es gibt mir:

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

Vielleicht sind wir die auth Customizing und deshalb nicht arbeiten, keine Ahnung. Hast du dieses Problem auch?

ZWEITE EDIT:

ich las, und wir haben Djangos Auth zu verwenden, nachdem die richtigen Einstellungen konfigurieren, wie wir beide getan haben.

Dann importieren Sie die von django.contrib.auth Import authentifizieren und verwenden Sie authentifizieren, wie es in Django docs zur Verfügung gestellt wird, hoffe, zu helfen; 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.") 

Antwort

6

ich das Problem lösen

In Django 1.6 ...

Meine settings.py wie folgt aussieht:

""" 
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/' 

und meine Ansichten. py sieht so aus:

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") 

jetzt das Benutzerobjekt in DB wie gespeichert wird:

{ 
    "_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

Ich bekomme einen Fehler in dieser Zeile user.backend = 'mongoengine.django.auth.MongoEngineBackend' Fehler ist 'MetaDict' Objekt hat kein Attribut 'pk' –

6

Hey ich bin in der gleichen Situation wie du bist. Wie ich herausfinden, können Sie diese in der settings.py haben

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

Und dies in den installierten Anwendungen

'mongoengine.django.mongo_auth' 

Dies bedeutet, dass Sie jetzt die Mongoengine Authentifizierungsmethode verwenden, die erste Zeile Sie sind Bei der Verwendung der DJANGO-Authentifizierungsmethode gibt es das Problem.Sie erstellen keine Datenbanken in mongodb, sondern in dem Dummy, den Sie mit dem backend.dummy im ORM von Django eingerichtet haben.

Ich weiß nicht, wie man Mongoengine's Auth-Methode verwendet, wenn Sie es herausfinden, erklären Sie es mir auch;) Ich hoffe, dass ich Ihnen ein wenig über das Problem geklärt habe, das wir beide hier gegenüberstellen. Es geht nur darum, die Dokumente tiefer zu lesen.

EDIT: (1 Minute nach der Antwort) fand ich dies in der Dokumentation, die Sie im Zusammenhang mit:

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.

so bedeutet das, dass in Ihrem Fall tauscht die

from django.contrib.auth import User 

zu

from mongoengine.django.auth import User 
1

Ich konnte die Fehlermeldung nicht reproduzieren, die Sie bekommen, @Bugfixer. Ich nehme an, es passiert, weil Sie AUTH_USER_MODEL in Ihren Einstellungen festgelegt haben. Dieser Eintrag sollte nur dann in Ihren Einstellungen sein, wenn Sie ein benutzerdefiniertes Benutzermodell haben.

Werden versuchen, genau in dieser Antwort zu setzen, was ich tat, um es mit einem benutzerdefinierten Benutzermodell laufen zu lassen, auf das ich einen Favoriten Array hinzufügen:

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' 

Modelle .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())) 

Lassen Sie mich wissen, wenn Sie irgendwelche Probleme haben.

Grüße

+0

Hallo Andre, es gibt mir, dass „Ad“ (im models.py) nicht definiert ist, kann ich es nicht herausfinden, was es ist. – BugFixer

+0

Es ist nur ein Beispiel für ein Modell .. Bearbeitete die Antwort mit einem einfacheren Namen. o/ –

+0

Warum versuchst du Auth mit Mongoengine zu beginnen? Hast du versucht, die Auth zu verwenden, die mit Django geliefert wird, mit dem Django ORM selbst? Das ORM ist tatsächlich kompatibel mit MongoDB ... Suchen Sie nach: ** Djongo ** – nesdis