2013-11-15 66 views
4

我想用mongoengine和django实现登录功能。mongoengine和django验证,登录

我已经包含了 'mongoengine.django.mongo_auth' 在INSTALLED_APPS

以下是来自现场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 “用户” >不JSON可序列化。 该错误是登录引发的,所以我想在这里登录API由django提供,但是我们提供给它的用户是从authenticate获得的值,它是mongoengine提供的api。

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

在这里的任何建议或我在这里执行的错误。

回答

1

第一个问题,你想要自定义用户对象?或者你想使用默认的Django用户模型?我问,因为如果你想制作自定义模型,你应该设置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)之后的方式工作。

因为我使用默认的Django用户模型,所以我没有在models.py上设置任何东西。

问候

1

安德烈我只是想你的例子,但它给了我

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

如果我输入jsonResponse像

from django.http import HttpResponse,JsonResponse 

然后给我

导入错误在/游戏/不能导入名称JsonResponse

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

谢谢。

+0

抱歉@BugFixer,我实现了这个jsonResponse方法。将编辑我的答案包括它。问候,AT –

+0

我不能让它运行,可能你可以给我一个关于mongoengine/django用户认证的问题,如果你能给我一只手,我会感激! http://stackoverflow.com/questions/22861077/django-auth-with-mongoengine-db – BugFixer