mongoengine和django auth,登录

时间:2013-11-15 22:02:28

标签: django authentication login mongoengine

我正在尝试使用mongoengine和django实现登录功能。

我在INSTALLED_APPS中加入了“mongoengine.django.mongo_auth”

以下是来自mongoengine网站的settings.py。

MONGOENGINE_USER_DOCUMENT = 'mongoengine.django.auth.User'
AUTH_USER_MODEL = 'mongo_auth.MongoUser'
SESSION_ENGINE = 'mongoengine.django.sessions'
AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
)

这是来自models.py

class UserInfo(User,DynamicDocument):
    address = EmbeddedDocumentField(Address)
    dob = DateTimeField(required = True)
    sex = StringField(max_length = 1, choices = SEX)
    primary_number = LongField(required = True)

以下是来自views.py

def LoginOrCreateUser(request):

    formAuth = AuthenticationForm(data=(request.POST or None))
    if(request.method=='POST'):
              if(formAuth.is_valid()):
                            if(formAuth.clean_email()):
                                    if(formAuth.clean_password()):
                                            formAuth.save(True)                
                                            user=authenticate(username=formAuth.cleaned_data['username'],password = formAuth.cleaned_data['password1'])
                                            login(request,user)                
                                            return HttpResponse('New User Success')
  

此代码给出了错误< obj_id“user”>不是JSON可序列化的。   登录引发了错误,所以我猜这里登录API是由django提供的,但我们提供给它的用户是来自authenticate的值,这是mongoengine提供的api。

我查看了django和mongoengine的auth.py。所以,我们在mongoengine中没有登录API。并且django的身份验证返回用户实例,而mongoengine的身份验证返回一个字符串,即用户名。

此处有任何建议或我在此处的实施中所犯的错误。

2 个答案:

答案 0 :(得分:1)

第一个问题,您是否尝试自定义User对象?或者您想使用默认的Django User模型?我问,因为如果你想制作一个自定义模型,你应该设置MONGOENGINE_USER_DOCUMENT和AUTH_USER_MODEL。

我将告诉你如何使用mongoengine x Django进行身份验证:

在settings.py

connect('localhost')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.dummy',
    }
}

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend'
)
SESSION_ENGINE = 'mongoengine.django.sessions'

在views.py

from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse

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

def createSession(request):
    if not request.is_ajax():
        return jsonResponse({'error':True})  

    if not request.session.exists(request.session.session_key):
        request.session.create() 

    data = extractDataFromPost(request)
    email = data["email"]
    password = data["password"]

    try: 
        user = User.objects.get(username=email)
        if user.check_password(password):
            user.backend = 'mongoengine.django.auth.MongoEngineBackend'
            user = authenticate(username=email, password=password)
            login(request, user)
            request.session.set_expiry(3600000) # 1 hour timeout
            return jsonResponse(serializeUser(user)) 
        else:
            result = {'error':True, 'message':'Invalid credentials'}
            return jsonResponse(result) 
    except User.DoesNotExist:
        result = {'error':True, 'message':'Invalid credentials'}
        return jsonResponse(result) 


def serializeUser(user):
    return simplejson.dumps({'email': user.email, 'username': user.username, 'id': str(user.id), 'firstName': user.first_name, 'lastName': user.last_name})

在阅读了很多东西后,我可以按照MongoEngine User authentication (django)的方式使其工作。

我没有在models.py上设置任何内容,因为我使用的是默认的Django用户模型。

此致

答案 1 :(得分:1)

André我刚试过你的例子,但它给了我

NameError at /game/
global name 'jsonResponse' is not defined

如果我导入jsonResponse,如

from django.http import HttpResponse,JsonResponse

然后给我

   / game /的ImportError无法导入名称JsonResponse

我只想用我的mongoengine后端管理简单的用户身份验证。

感谢。