使用Django的auth机制,避免重复造轮子。
1.创建user app,在settings.py中注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
]
2.使用Django系统user,其实更好的方式是自建类继承AbstractUser类,修改系统默认用户表,但是考察了自己的系统,发现基本上用到的字段在系统表中都有涵盖,所以简单使用了系统User。
但是需要注意的是:在开始的需求分析中设置了登录注册时输入的是邮箱,所以要求都不得重复。其实应该对邮箱做正则匹配判断格式、向邮箱发验证码等,后续会再完善。
在views.py中编写视图函数:
(1)注册
def register(request):
# 从 HTTP POST 请求中获取用户名、密码参数
if request.method=='POST':
req = json.loads(request.body)
username = req.get('email')
pwd = req.get('password')
check_pwd = req.get('check_pwd')
#shadow_test,123456
filterResult = User.objects.filter(username=username)
if len(filterResult)!=0:
return JsonResponse({
'ret':2,
'msg':'该邮箱已注册'
})
if pwd != check_pwd:
return JsonResponse({
'ret': 1,
'msg': '两次密码不相同'
})
user = User.objects.create_user(username=username, password=pwd)
return JsonResponse({
'ret':0,
'msg':'注册成功,注册用户的id为:',
'id':user.id
})
这里request传参过来的写法一定注意,开始一直抛异常,没有从request中获取到参数,几个字段都为空,修改为上面的写法才成功。
使用Django自带的User类的用户创建,先手动判断两次输入的密码是否相同、该邮箱是否已经注册,创建用户。
(2)登录
def login(request):
if request.method=='POST':
req = json.loads(request.body)
username = req.get('email')
pwd = req.get('password')
user = authenticate(username=username,password=pwd)
if user is not None:
if user.is_active:
auth.login(request,user)
#一旦注册了session,这个就变成了request.user,在所有的views函数中都可以直接使用
#request.user表示当前登录对象,request.user=user
request.session['usertype']='valid'
return JsonResponse({
'ret':0,
'msg':'登录成功'
})
else:
return JsonResponse({
'ret':1,
'msg':'用户已被封禁(逻辑上不存在),请联系管理员,该用户的id为',
'id':user.id
})
else:
return JsonResponse({
'ret':2,
'msg':'用户名或密码错误'
})
user = authenticate(username=username,password=pwd)语句调用User自带的authenticate方法,验证登录用户,如果用户名和密码不匹配会返回None;此外对用户是否逻辑删除做判断(is_active)。用户登录使用auth.login(),会自动将该用户信息注册到django_session表中。
一旦注册了session,当前这个登录的用户就可以用request.user来指代。
此外,需要加深对session机制的理解:https://www.jb51.net/article/182218.htm
之后为了提高性能,会考虑使用Redis缓存。
用户登录之后,session表中会增加一条记录,登出的时候该记录删除,修改用户信息后该记录也会改变。
(3)登出
# 登出处理
def logout(request):
# 使用登出方法
auth.logout(request)
return JsonResponse({
'ret': 0,
'msg':'成功登出'
})
(4)修改密码
def changePwd(request):
if request.method=='POST':
req = json.loads(request.body)
username = req.get('email')
pwd = req.get('password')
new_pwd = req.get('new_pwd')
check_pwd = req.get('check_pwd')#重复新密码
user = User.objects.get(username=username)
if user.check_password(pwd):
if new_pwd == check_pwd:
user.set_password(password=new_pwd)
user.save()
update_session_auth_hash(request, user)
return JsonResponse({
'ret':0,
'msg':'密码修改成功'
})
else:
return JsonResponse({
'ret':1,
'msg':'两次输入的新密码不同'
})
else:
return JsonResponse({
'ret':2,
'msg':'原密码输入错误'
})
但是在这里我自己遇到了一点小小的问题,我想在本机测试两个不同的账号,但是session表无论怎么更新都只有一组记录,晚点再摸索一下。
之后考虑使用修饰器@login_required,现在因为还没有摸清前后端分离架构,暂时使用
if not request.user.is_authenticated。
今晚会完成对论文、评论、收藏等的增删改查



