我正在尝试使用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的身份验证返回一个字符串,即用户名。
此处有任何建议或我在此处的实施中所犯的错误。
答案 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后端管理简单的用户身份验证。
感谢。