Django网站建设-用户注册、登陆、邮箱激活、密码找回

阅读:1113 2019-03-20 14:08:57 来源:新网

djangourlname详解

注册登录将所有的静态文件修改为相对路径staticfile(前提在setting中设置好static_url和staticfiles_dirs才能找到路径)

以后所有写成相对路径

#模板中添加声明{%loadstaticfiles%}#添加方法,如此以来,即使修改了static的路径也不会修改,因为引用的是相对路径安装django-simple-captcha,用于生成验证码。

下载连接-github

文档说明

installation1、installdjango-simple-captchaviapip:pipinstalldjango-simple-captcha2、addcaptchatotheinstalled_appsinyoursettings.py3、runpythonmanage.pymigrate4、addanentrytoyoururls.py:

urlpatterns+=[url(r'^captcha/',include('captcha.urls')),]添加验证吗在app.form中建立register_form表单,定义好注册需要的字段(form可自动生成input框)【form实现了后台与前端的交互】

classregisterform(forms.form):email=forms.emailfield(required=true)password=forms.charfield(required=true,min_length=5)captcha=captchafield()将form加入registerview视图中,并将form数据传入template中

classregisterview(view):defget(self,request):register_form=registerform()returnrender(request,'register.html',{'register_form':register_form})#将register_form数据传递给template通过template将register_form传入html中,生成验证码(form数据可通过template自动生成input框)

{{register_form.captcha}}

完成注册的后台逻辑,get方法用于刷新,post方法用于接受用户信息并进行存储

classregisterview(view):defget(self,request):register_form=registerform()returnrender(request,'register.html',{'register_form':register_form})#将register_form数据传递给templatedefpost(self,request):register_form=registerform(request.post)#将post上来的数据传递给registerformifregister_form.is_valid():#上传的数据符合form表要求,有效user_name=request.post.get('username','')ifuserprofile.objects.filter(email=user_name):returnrender(request,'register.html',{'register_form':register_form,'msg':'用户已存在'})#该逻辑用户判断用户是否已注册存在pass_word=request.post.get('password','')user_profile=userprofile()user_profile.username=user_nameuser_profile.email=user_name#明文数据需要经过加密后传入数据库,利用make_password方法加密user_profile.password=make_password(pass_word)user_profile.save()else:returnrender(request,'register.html',{'register_form':register_form})#将register_form数据传递给template注意html中相同的、多余的input会影响文本输出将value传回template中

邮箱地址"/>通过邮箱发送验证链接进行注册激活django使用qq/新浪邮箱发送邮件配置创建utils文件夹,用于存放工具函数/类

fromusers.modelsimportemailverifycodefromrandomimportrandomfromdjango.core.mailimportsend_mailfromgmooc.settingsimportemail_host,email_port,email_host_user,email_host_password,email_use_tls,email_from用于生成随机生成验证吗,长度可调

#随机生成验证吗,长度可调defrandom_str(random_length=8):code=''chars='abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz1234567890'random=random()length=len(chars)-1foriinrandom_length:code+=chars[random.randint(0,length)]returncode用于生成随机验证码和对应的邮箱并存入数据库中,将验证码以链接形式发送至邮箱,点击进行激活

defsend_register_email(email,send_type='register'):###########################生成随机验证码存入数据库中############################继承模型email_record=emailverifycode()code=random_str(16)#将随机生成code存入数据库中email_record.code=code#将管理的邮箱传入数据库中email_record.email=email#定义发送类型email_record.send_type=send_typeemail_record.save()###########################发送激活邮件###########################email_title=''email_body=''receive_email=emailifsend_type=='register':email_title='慕学在线激活连接'email_body='请点击下方连接,激活注册:'+'http://127.0.0.1:8000/active/{0}'.format(code)ifsend_type=='find_password':email_title='慕学在线密码找回连接'email_body='请点击下方连接,进行密码找回:'+'http://127.0.0.1:8000/active/{0}'.format(code)send_status=send_mail(email_title,email_body,email_from,[receive_email])将注册页上传上来的信息保存值userprofile,但是is_active还是0,表示还未进行激活。完成注册后跳转至登陆页面,注册失败的仍停留在注册页

classregisterview(view):defget(self,request):register_form=registerform()returnrender(request,'register.html',{'register_form':register_form})#将register_form数据传递给template#returnrender(request,'register.html',{})defpost(self,request):register_form=registerform(request.post)#将post上来的数据传递给registerformifregister_form.is_valid():#上传的数据符合form表要求,有效user_name=request.post.get('email','')pass_word=request.post.get('password','')########注册的时候需要查看邮箱是否有重复,利用了username进行了去重#######user_profile=userprofile()user_profile.username=user_nameuser_profile.email=user_name#明文数据需要经过加密后传入数据库,利用make_password方法加密user_profile.password=make_password(pass_word)user_profile.is_active=0#表面用户还未激活user_profile.save()#用于邮件激活操作send_register_email(user_name,send_type='register')returnrender(request,'login.html',{})#将register_form数据传递给templateelse:#注册失败跳转至index页面,暂时#returnrender(request,'index.html',{})returnrender(request,'register.html',{'register_form':register_form})#将register_form数据传递给template在url中,通过(?p.*)正则获取获取匹配的字符串(实际就是发送的验证码),绑定activeuserview,通过该类完成激活

url(r'^active/(?p.*)/$',activeuserview.as_view(),name='active_user')activeuserview原理就是通过get,获取激活的请求,通过验证码在emailverifycode中查询到对应的邮箱,通过邮箱在userprofile查询到对应的账号信息,并将is_active变为1,即完成激活

classactiveuserview(view):defget(self,request,active_code):#利用code在emailverifycode进行查询emailverifycoderecorder=emailverifycode.objects.filter(code=active_code)ifemailverifycoderecorder:#找到userprofile中的对应账号,并设is_active为1,即为激活账号foriinemailverifycoderecorder:email=i.emailuser=userprofile.objects.get(email=email)user.is_active=1user.save()returnrender(request,'login.html',{})#将register_form数据传递给templateelse:returnrender(request,'active_fail.html',{})#找不到记录则返回连接失效的页面密码找回在template中设置忘记密码的跳转

忘记密码?在url中定义forgetpwd页面

url(r'^forgetpwd/$',forgetpwdview.as_view(),name='forgetpwd'),定义forgetpwdform

classforgetpwdform(forms.form):email=forms.emailfield(required=true)captcha=captchafield(error_messages={'invalid':u'验证码错误'})将form的验证码form传入html中,并配置好静态文件

#html中配置验证码{{forgetpwd_form.captcha}}发送邮箱的函数

defsend_email(email,send_type='register'):###########################生成随机验证码存入数据库中############################继承模型email_record=emailverifycode()code=random_str(16)#将随机生成code存入数据库中email_record.code=code#将管理的邮箱传入数据库中email_record.email=email#定义发送类型email_record.send_type=send_typeemail_record.save()###########################发送激活邮件###########################email_title=''email_body=''receive_email=emailifsend_type=='register':email_title='慕学在线激活连接'email_body='请点击下方连接,激活注册:'+'http://127.0.0.1:8000/active/{0}'.format(code)ifsend_type=='find_password':email_title='慕学在线密码找回连接'email_body='请点击下方连接,进行密码找回:'+'http://127.0.0.1:8000/password_reset/{0}'.format(code)send_status=send_mail(email_title,email_body,email_from,[receive_email])在view中定义forgetpwdview后台逻辑

classforgetpwdview(view):defget(self,request):forgetpwd_form=forgetpwdform()returnrender(request,'forgetpwd.html',{'forgetpwd_form':forgetpwd_form})#将验证码传递给前端defpost(self,request):forgetpwd_form=forgetpwdform(request.post)ifforgetpwd_form.is_valid():#post数据成功,将验证码保存在emailverifycode,用于激活查询,并跳转至index页面email=request.post.get('email')send_email(email,send_type='find_password')returnrender(request,'index.html',{})else:#验证码错误或邮箱格式错误返回信息returnrender(request,'forgetpwd.html',{'forgetpwd_form':forgetpwd_form})注意form表单的变量名称要与html中的name保持一直,forgetpwd_form=forgetpwdform(request.post)才能匹配编写修改密码连接的url,绑定passwordreset

url(r'^password_reset/(?p.*)/$',passwordreset.as_view(),name='password_reset'),编写修改密码的后台逻辑打开连接,后台自动获取相对唯一的active_code,通过active_code在emailverifycode中找到对应的email,通过email在userprofile中找到对应的用户信息,符合条件则修改用户密码。

classpasswordreset(view):defget(self,request,active_code):returnrender(request,'password_reset.html',{})#获取修改密码页面defpost(self,request,active_code):emailverifycoderecorder=emailverifycode.objects.filter(code=active_code)#通过active_code去emailverifycode找到对应的emailifemailverifycoderecorder:#如果该验证码存在#找到userprofile中的对应账号,进行修改密码foriinemailverifycoderecorder:#一般来说该验证码是唯一的email=i.email#找到emailuser=userprofile.objects.get(email=email)#通过email在userprofile中找到对应的用户数据password_reset=passwordresetform(request.post)#新密码上传至表单中ifpassword_reset.is_valid():#新设置的密码符合表单的话password=request.post.get('password','')password2=request.post.get('password2','')ifpassword==password2:#两个密码相同,所有逻辑正确,进行密码修改#在数据库中信息密码修改user.password=make_password(password)user.save()returnrender(request,'login.html',{})#将register_form数据传递给templateelse:#如果两个密码不相同returnrender(request,'password_reset.html',{'msg':'两个密码不一致'})#将register_form数据传递给templateelse:#表单验证不通过returnrender(request,'password_reset.html',{'msg':'密码未填写或格式有问题'})else:pass#返回404页面template的修改

1.静态文件配置:{%static'name'%}2.url的配置:{%url'name'%}3.错误信息提示:{%forkey,errorinforgetpwd_form.errors.items%}{{error}}{%endfor%}

4.错误信息聚焦:5.值回填用户退出

用户退出

退出在url中定义好视图逻辑

url(r'^loginout/$',logout_view,name='user_loginout'),在view中定义好logout_view函数的逻辑,利用系统logout函数清除request的登陆信息

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服