一、完成登录注册退出逻辑
1、路由和视图函数;
2、前端
3、forms类,制定规则
二、验证码
1、安装python包:django-simple-captcha
2、配置
3、迁移同步
4、修改forms类、视图函数、前端
三、邮箱发送与激活
1、在settings中配置邮箱
数据来源(163邮箱)
2、自定义发邮件工具包
from users.models import EmailVerifyCode
# from random import choice
from random import randrange,randint
from django.core.mail import send_mail
from GuLiEdu.settings import EMAIL_FROM
def get_random_code(code_length):
code_source = '2134567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
code = ''
for i in range(code_length):
#随机选择一个字符
str = code_source[randrange(0,len(code_source))]
code += str
# code += choice(code_source)
return code
def send_email_code(email,send_type):
#第一步:创建邮箱验证码对象,保存数据库,用来以后做对比
code = get_random_code(8)
a = EmailVerifyCode()
a.email = email
a.send_type = send_type
a.code = code
a.save()
#第二步:正式的发邮件功能
send_title = ''
send_body = ''
if send_type == 1:
send_title = '欢迎注册谷粒教育网站:'
send_body = '请点击以下链接进行激活您的账号:\n http://127.0.0.1:8000/users/user_active/'+code
send_mail(send_title,send_body,EMAIL_FROM,[email])
if send_type == 2:
send_title = '谷粒教育重置密码系统:'
send_body = '请点击以下链接进行重置您的密码:\n http://127.0.0.1:8000/users/user_reset/' + code
send_mail(send_title, send_body, EMAIL_FROM, [email])
if send_type == 3:
send_title = '谷粒教育修改邮箱验证码:'
send_body = '您的验证码是:'+ code
send_mail(send_title, send_body, EMAIL_FROM, [email])
3、视图函数
def user_register(request):
if request.method == 'GET':
#这里实例化forms类,目的不是为了验证,而是为了使用验证码
user_register_form = UserRegisterForm()
return render(request,'users/register.html',{
'user_register_form':user_register_form
})
else:
user_register_form = UserRegisterForm(request.POST)
if user_register_form.is_valid():
email = user_register_form.cleaned_data['email']
password = user_register_form.cleaned_data['password']
user_list = UserProfile.objects.filter(Q(username=email)|Q(email=email))
if user_list:
return render(request,'users/register.html',{
'msg':'用户已经存在'
})
else:
a = UserProfile()
a.username = email
a.set_password(password)
a.email = email
a.save()
send_email_code(email,1)
return HttpResponse('请尽快前往您的邮箱激活,否则无法登陆')
# return redirect(reverse('index'))
else:
return render(request, 'users/register.html', {
'user_register_form': user_register_form
})
四、忘记密码与修改密码
视图函数
def user_forget(request):
if request.method == 'GET':
user_forget_form = UserForgetForm()
return render(request, 'users/forgetpwd.html', {
'user_forget_form': user_forget_form
})
else:
user_forget_form = UserForgetForm(request.POST)
if user_forget_form.is_valid():
email = user_forget_form.cleaned_data['email']
user_list = UserProfile.objects.filter(email=email)
if user_list:
send_email_code(email, 2)
return HttpResponse('请尽快去您的邮箱去重置密码')
else:
return render(request, 'users/forgetpwd.html', {
'msg': '用户不存在',
'user_forget_form': user_forget_form
})
else:
return render(request, 'users/forgetpwd.html', {
'user_forget_form': user_forget_form
})
def user_reset(request, code):
if code:
if request.method == 'GET':
return render(request, 'users/password_reset.html', {
'code': code
})
else:
user_reset_form = UserResetForm(request.POST)
if user_reset_form.is_valid():
password = user_reset_form.cleaned_data['password']
password1 = user_reset_form.cleaned_data['password1']
if password == password1:
email_ver_list = EmailVerifyCode.objects.filter(code=code)
if email_ver_list:
email_ver = email_ver_list[0]
email = email_ver.email
user_list = UserProfile.objects.filter(email=email)
if user_list:
user = user_list[0]
user.set_password(password1)
user.save()
return redirect(reverse('users:user_login'))
else:
pass
else:
pass
else:
return render(request, 'users/password_reset.html', {
'msg': '两次密码步一致',
'code': code
})
else:
return render(request, 'users/password_reset.html', {
'user_reset_form': user_reset_form,
'code': code
})