1、注册和注册处理
注册和注册处理使用了类视图去处理,使用itsdangerous去生成用户token,:
#user/urls
url(r'^register/$',RegisterView.as_view(),name='register'),#注册
#user/views.py
class RegisterView(View):
'''注册'''
def get(self,request):
'''显示注册页面'''
return render(request, 'register.html')
def post(self,request):
'''注册处理'''
# 获取请求数据
username = request.POST.get('user_name')
print("username:", username)
password = request.POST.get('pwd')
pw_sure = request.POST.get('cpwd')
email = request.POST.get('email')
allow = request.POST.get('allow')
# 验证数据
# 1、用户,密码,邮箱都不能为空
if not all((username, password, email)):
return render(request, 'register.html', context={
'errormg': '用户名、密码、邮箱不能为空',
})
# 2、密码和确认密码需一致
if password != pw_sure:
return render(request, 'register.html', context={
'errormg': '密码和确认密码不一致',
})
# 3、校验邮箱
if not re.match('^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
return render(request, 'register.html', context={
'errormg': '邮箱格式不正确',
})
# 4、校验同意协议
if allow != 'on':
return render(request, 'register.html', context={
'errormg': '请同意协议',
})
# 5、校验用户名重复不能创建
try:
user = User.objects.get(username=username)
except User.DoesNotExist: # 用户不存在
user = None
if user:
return render(request, 'register.html', context={
'errormg': '用户名已存在',
})
user = User.objects.create_user(username, email, password)
user.is_active = 0 # 没有激活
user.save()
# 发送激活邮件,包含激活链接:http://127.0.0.1:8000/user/active/user_id
# 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
#加密用户的身份信息,生成激活token
serializer = Serializer(settings.SECRET_KEY,3600)
info = {"confirm":user.id}
token = serializer.dumps(info)
#发送邮件
#返回应答,跳转到首页
return redirect(reverse('goods:index'))
2、注册激活用户
用户激活成功,返回到登陆页面,如果激活链接过期,重新又生成链接时激活(之后更新写)
#user/urls.py
url(r'^active/(?P.*)/$',ActionView.as_view(),name='action') ,#用户激活
path('login',LoginView.as_view(),name='login'),#登陆页面
#user/view.py
class ActionView(View):
'''用户激活'''
def get(self,request,token):
'''进行用户激活'''
try:
serializer = Serializer(settings.SECRET_KEY, 3600)
info = serializer.loads(token)
user_id = info['confirm']
user = User.objects.get(id=user_id)
user.is_active=1
user.save()
except SignatureExpired as e:
#链接过期,重新生成激活的链接
return HttpResponse('激活链接已过期')
#成功激活返回登陆页
return redirect(reverse('user:login'))
class LoginView(View):
'''登陆页面'''
def get(self,request):
return render(request,'login.html',context={})