Django有一个完善的登录系统,session处理机制。我们直接使用这个登录系统,还是比较方便的。本文就说说在admin之外的登录方法。
首先自定义一个LoginBackend,判断Username就可以了(这里电话号码被我占时屏蔽了)
# -*- coding: utf-8 -*- import re from django.contrib.auth.models import User class LoginBackend(object): def authenticate(self, username=None, password=None): if username: #email if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", username) != None: try: user = User.objects.get(email=username) if user.check_password(password): return user except User.DoesNotExist: return None #mobile elif False:# len(username)==11 and re.match("^(1[3458]\d{9})$", username) != None: try: user = User.objects.get(mobile=username) if user.check_password(password): return user except User.DoesNotExist: return None #nick else: try: user = User.objects.get(username=username) if user.check_password(password): return user except User.DoesNotExist: return None else: return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None
然后,在settings.py中声明(然后你看看admin是不是可以用邮箱登录了)
AUTHENTICATION_BACKENDS = ( 'account.backends.LoginBackend', )
@require_POST @csrf_exempt #占时屏蔽,让客户端访问 def j_Login(request): username = request.POST['username'] password = request.POST['password'] result = {"status": False, "data":""} if username=="" or username.isspace(): result = {"status": False, "data": u"用户名不能为空"} return HttpResponse(simplejson.dumps(result, ensure_ascii = False)) if password=="" or password.isspace(): result = {"status": False, "data": u"密码不能为空"} return HttpResponse(simplejson.dumps(result, ensure_ascii = False)) user = auth.authenticate(username=username, password=password) if user is not None: if user.is_active: auth.login(request, user) result = {"status": True, "data": "OK"} return HttpResponse(simplejson.dumps(result, ensure_ascii = False)) else: result = {"status": False, "data": "[" + username + u"]已被暂时禁用"} return HttpResponse(simplejson.dumps(result, ensure_ascii = False)) else: result = {"status": False, "data": u"用户名或密码不正确,请重试"} return HttpResponse(simplejson.dumps(result, ensure_ascii = False))
几点说明一下:
ensure_ascii = False可以返回中文,而不是变成ascii编码了
话说都需要加一个mimetype=”application/json”,或者content_type=”application/json”,但是我加上去就中文乱码了
return HttpResponse(simplejson.dumps(result, ensure_ascii = False), mimetype="application/json")
这个可以用原来的@login_required,也可以自定义一个装饰器(用来返回json数据)
def json_login_required(): ''' check login status. if no, will return "NO_LOGIN" ''' def decorator(view_func): @wraps(view_func) def _wrapped_view(request, *args, **kwargs): if request.user.is_authenticated(): return view_func(request, *args, **kwargs) else: return HttpResponse("NO_LOGIN") return _wrapped_view return decorator