복붙노트

[PYTHON] 장고 - 다른 DB와 Auth

PYTHON

장고 - 다른 DB와 Auth

내 mongoengine db로 장고 프로젝트의 인증을 처리하고 싶습니다.

나는이 물건에 대한 몇 가지 예를 낡은 질문에 대답했지만 시도하지 않았다. 나는 장고 1.6과 몽고 엥교를 사용하고있다. 모든 것이 설치되고 실행되며 Mongoengine DB에 문서를 생성하고 저장할 수 있습니다.

나는 http://mongoengine-odm.readthedocs.org/en/latest/django.html을 따르고있다.

그리고 나는 다음과 같은 오류가 발생합니다 :

내가 달릴 때 :

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', '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 가지를 이해하지 못한다.

- 사용자를 저장하거나 자동으로 생성 될 데이터베이스를 만들고 정의해야합니까?

- 매니저는 무엇입니까? 나는 매니저 물건을 정의하지 않았다.

처음에는 등록기가 DB에 저장되었다고 생각했습니다. '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가 적절하게 구성됩니다.

EDIT @cestDiego :

내 설정은 정확히 동일합니다. 나는 Db 백엔드에 대해 알아 봤습니다. 왜냐하면 내가 몽고를 사용하기 때문에 관심이없는 데이터베이스를 만듭니다 ... 어쨌든 나는 mongoengine.django.auth import에서 사용자를 사용하고 있습니다. 나를 되 찾는 사용자를 만드는 방법 :

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

어쩌면 우리는 인증을 사용자 지정하는 것이므로 작동하지 않는 이유는 없습니다. 이 문제가 너무 있습니까?

두 번째 편집 :

나는 독서를하고 있었고, 우리가했던 것처럼 올바른 설정을 구성한 후에 Djangos auth를 사용해야한다.

그런 다음 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.")

해결법

  1. ==============================

    1.나는 너와 같은 상황에있어. 내가 알아낼 수있는 것은 settings.py

    나는 너와 같은 상황에있어. 내가 알아낼 수있는 것은 settings.py

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

    그리고 설치된 앱에서

    'mongoengine.django.mongo_auth'
    

    즉, 이제 Mongoengine 인증 방법을 사용하고 있습니다. 사용중인 첫 번째 줄에서는 DJANGO 인증 방법을 가져 오므로 문제가 있습니다. mongodb에 데이터베이스를 만들지는 않겠지 만, 더미 데이터베이스에서는 장고의 ORM에 backend.dummy를 설정했습니다.

    mongoengine의 인증 방법을 사용하는 법을 모르겠다면 설명해주십시오. 나에게도 설명해주십시오.) 나는 우리가 여기서 마주하고있는 문제에 관해 당신에게 약간의 설명을하기를 희망합니다. 문서를 더 깊게 읽는 것만으로도 문제가됩니다.

    편집 : (대답 후 1 분) 내가 링크 된 문서에서 이것을 발견했습니다 :

    그래서 당신의 경우에는

    from django.contrib.auth import User
    

    from mongoengine.django.auth import User
    
  2. ==============================

    2.나는 문제를 해결한다.

    나는 문제를 해결한다.

  3. ==============================

    3.내가 받고있는 오류 메시지를 재현 할 수 없습니다. @ 버그 수 있습니다. 설정에 AUTH_USER_MODEL이 설정되어 있기 때문에 상황이 진행되고 있다고 가정합니다.이 항목은 사용자 정의 사용자 모델이있는 경우에만 설정에 있어야합니다.

    내가 받고있는 오류 메시지를 재현 할 수 없습니다. @ 버그 수 있습니다. 설정에 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'
    

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

    네가 문제가 있으면 알려줘.

    문안 인사

  4. from https://stackoverflow.com/questions/22861077/django-auth-with-mongoengine-db by cc-by-sa and MIT license