django url name详解(运用相对路径,修改匹配正则后可减少修改量)
django url name详解
将temlate中所有的修改为相对路径url
<a style=”color:white” class=”fr registerbtn” href=”{% url \\\’register\\\’ %}”>注册</a> <a style=”color:white” class=”fr loginbtn” href=”{% url \\\’user_login\\\’ %}”>登录</a> 将所有的静态文件修改为相对路径staticfile(前提在setting中设置好static_url 和staticfiles_dirs才能找到路径)
以后所有写成相对路径
#模板中添加声明 {% load staticfiles %} #添加方法,如此以来,即使修改了static的路径也不会修改,因为引用的是相对路径 <link rel=”stylesheet” type=”text/css” href=”{% static \\\’css/reset.css\\\’ %}”> <link rel=”stylesheet” type=”text/css” href=”{% static \\\’css/animate.css\\\’ %}”> <link rel=”stylesheet” type=”text/css” href=”{% static \\\’css/style.css\\\’ %}”> 安装django-simple-captcha,用于生成验证码。
下载连接-github
文档说明
installation
1、install django-simple-captcha via pip: pip install django-simple-captcha
2、add captcha to the installed_apps in your settings.py
3、run python manage.py migrate
4、add an entry to your urls.py:
urlpatterns = [ url(r\\\’^captcha/\\\’, include(\\\’captcha.urls\\\’)), ] 添加验证吗 在app.form中建立register_form表单,定义好注册需要的字段(form可自动生成input框)【form实现了后台与前端的交互】
class registerform(forms.form): email = forms.emailfield(required=true) password = forms.charfield(required=true,min_length=5) captcha = captchafield() 将form加入registerview视图中,并将form数据传入template中
class registerview(view): def get(self,request): register_form = registerform() return render(request,\\\’register.html\\\’,{\\\’register_form\\\’:register_form}) #将register_form数据传递给template 通过template将register_form传入html中,生成验证码(form数据可通过template自动生成input框)
<div class=”form-group marb8 captcha1 “> <label>验 证 码</label> {{ register_form.captcha }} </div> 完成注册的后台逻辑,get方法用于刷新,post方法用于接受用户信息并进行存储
class registerview(view): def get(self,request): register_form = registerform() return render(request,\\\’register.html\\\’,{\\\’register_form\\\’:register_form}) #将register_form数据传递给template def post(self, request): register_form = registerform(request.post) #将post上来的数据传递给registerform if register_form.is_valid(): #上传的数据符合form表要求,有效 user_name = request.post.get(\\\’username\\\’,\\\’\\\’) if userprofile.objects.filter(email=user_name): return render(request, \\\’register.html\\\’, {\\\’register_form\\\’:register_form,\\\’msg\\\’: \\\’用户已存在\\\’}) # 该逻辑用户判断用户是否已注册存在 pass_word = request.post.get(\\\’password\\\’,\\\’\\\’) user_profile = userprofile() user_profile.username = user_name user_profile.email = user_name #明文数据需要经过加密后传入数据库,利用make_password方法加密 user_profile.password = make_password(pass_word) user_profile.save() else: return render(request, \\\’register.html\\\’, {\\\’register_form\\\’: register_form}) # 将register_form数据传递给template 注意html中相同的、多余的input会影响文本输出 将value传回template中
<input type=”text” id=”id_email” name=”email” value=”{{ register_form.email.value }}” placeholder=”请输入您的邮箱地址” /> <input type=”password” id=”id_password” name=”password” value=”{{ register_form.password.value }}” placeholder=”请输入6-20位非中文字符密码” /> 通过邮箱发送验证链接进行注册激活 django 使用 qq / 新浪邮箱发送邮件配置 创建utils文件夹,用于存放工具函数/类
from users.models import emailverifycode from random import random from django.core.mail import send_mail from gmooc.settings import email_host,email_port,email_host_user,email_host_password,email_use_tls,email_from 用于生成随机生成验证吗,长度可调
#随机生成验证吗,长度可调 def random_str(random_length=8): code = \\\’\\\’ chars = \\\’abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz1234567890\\\’ random = random() length = len(chars)-1 for i in random_length: code = chars[random.randint(0,length)] return code 用于生成随机验证码和对应的邮箱并存入数据库中,将验证码以链接形式发送至邮箱,点击进行激活
def send_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_type email_record.save() ###########################发送激活邮件########################### email_title = \\\’\\\’ email_body = \\\’\\\’ receive_email = email if send_type == \\\’register\\\’: email_title = \\\’慕学在线激活连接\\\’ email_body = \\\’请点击下方连接,激活注册:\\\’ \\\’http://127.0.0.1:8000/active/{0}\\\’.format(code) if send_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,表示还未进行激活。完成注册后跳转至登陆页面,注册失败的仍停留在注册页
class registerview(view): def get(self,request): register_form = registerform() return render(request,\\\’register.html\\\’,{\\\’register_form\\\’:register_form}) #将register_form数据传递给template #return render(request,\\\’register.html\\\’,{}) def post(self, request): register_form = registerform(request.post) #将post上来的数据传递给registerform if register_form.is_valid(): #上传的数据符合form表要求,有效 user_name = request.post.get(\\\’email\\\’,\\\’\\\’) pass_word = request.post.get(\\\’password\\\’,\\\’\\\’) ########注册的时候需要查看邮箱是否有重复,利用了username进行了去重####### user_profile = userprofile() user_profile.username = user_name user_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\\\’) return render(request, \\\’login.html\\\’, {}) # 将register_form数据传递给template else: #注册失败跳转至index页面,暂时 #return render(request,\\\’index.html\\\’,{}) return render(request, \\\’register.html\\\’, {\\\’register_form\\\’:register_form}) # 将register_form数据传递给template 在url中,通过(?p.*)正则获取获取匹配的字符串(实际就是发送的验证码),绑定activeuserview,通过该类完成激活
url(r\\\’^active/(?p<active_code>.*)/$\\\’,activeuserview.as_view(),name=\\\’active_user\\\’) activeuserview原理就是通过get,获取激活的请求,通过验证码在emailverifycode中查询到对应的邮箱,通过邮箱在userprofile查询到对应的账号信息,并将is_active 变为1,即完成激活
class activeuserview(view): def get(self,request,active_code): #利用code在emailverifycode进行查询 emailverifycoderecorder = emailverifycode.objects.filter(code=active_code) if emailverifycoderecorder: #找到userprofile中的对应账号,并设is_active为1,即为激活账号 for i in emailverifycoderecorder: email = i.email user = userprofile.objects.get(email=email) user.is_active = 1 user.save() return render(request, \\\’login.html\\\’, {}) # 将register_form数据传递给template else: return render(request, \\\’active_fail.html\\\’, {}) #找不到记录则返回连接失效的页面 密码找回 在template中设置忘记密码的跳转
<a class=”fr” href=”{% url \\\’forgetpwd\\\’ %}”>忘记密码?</a> 在url中定义forgetpwd页面
url(r\\\’^forgetpwd/$\\\’, forgetpwdview.as_view(), name=\\\’forgetpwd\\\’), 定义forgetpwdform
class forgetpwdform(forms.form): email = forms.emailfield(required=true) captcha = captchafield(error_messages={\\\’invalid\\\’:u\\\’验证码错误\\\’}) 将form的验证码form传入html中,并配置好静态文件
#html中配置验证码 {{ forgetpwd_form.captcha }} 发送邮箱的函数
def send_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_type email_record.save() ###########################发送激活邮件########################### email_title = \\\’\\\’ email_body = \\\’\\\’ receive_email = email if send_type == \\\’register\\\’: email_title = \\\’慕学在线激活连接\\\’ email_body = \\\’请点击下方连接,激活注册:\\\’ \\\’http://127.0.0.1:8000/active/{0}\\\’.format(code) if send_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后台逻辑
class forgetpwdview(view): def get(self,request): forgetpwd_form = forgetpwdform() return render(request,\\\’forgetpwd.html\\\’,{\\\’forgetpwd_form\\\’:forgetpwd_form}) #将验证码传递给前端 def post(self,request): forgetpwd_form = forgetpwdform(request.post) if forgetpwd_form.is_valid(): #post数据成功,将验证码保存在emailverifycode,用于激活查询,并跳转至index页面 email = request.post.get(\\\’email\\\’) send_email(email, send_type=\\\’find_password\\\’) return render(request,\\\’index.html\\\’,{}) else: #验证码错误或邮箱格式错误返回信息 return render(request,\\\’forgetpwd.html\\\’,{\\\’forgetpwd_form\\\’:forgetpwd_form}) 注意form表单的变量名称要与html中的name保持一直, forgetpwd_form = forgetpwdform(request.post)才能匹配 编写修改密码连接的url,绑定passwordreset
url(r\\\’^password_reset/(?p<active_code>.*)/$\\\’, passwordreset.as_view(), name=\\\’password_reset\\\’), 编写修改密码的后台逻辑 打开连接,后台自动获取相对唯一的active_code,通过active_code在emailverifycode中找到对应的email,通过email在userprofile中找到对应的用户信息,符合条件则修改用户密码。
class passwordreset(view): def get(self,request,active_code): return render(request,\\\’password_reset.html\\\’,{}) #获取修改密码页面 def post(self,request,active_code): emailverifycoderecorder = emailverifycode.objects.filter(code=active_code) #通过active_code去emailverifycode找到对应的email if emailverifycoderecorder: #如果该验证码存在 # 找到userprofile中的对应账号,进行修改密码 for i in emailverifycoderecorder: #一般来说该验证码是唯一的 email = i.email #找到email user = userprofile.objects.get(email=email) #通过email在userprofile中找到对应的用户数据 password_reset = passwordresetform(request.post) #新密码上传至表单中 if password_reset.is_valid(): #新设置的密码符合表单的话 password = request.post.get(\\\’password\\\’,\\\’\\\’) password2 = request.post.get(\\\’password2\\\’,\\\’\\\’) if password == password2: #两个密码相同,所有逻辑正确,进行密码修改 #在数据库中信息密码修改 user.password = make_password(password) user.save() return render(request, \\\’login.html\\\’, {}) # 将register_form数据传递给template else: #如果两个密码不相同 return render(request, \\\’password_reset.html\\\’, {\\\’msg\\\’:\\\’两个密码不一致\\\’}) # 将register_form数据传递给template else: #表单验证不通过 return render(request, \\\’password_reset.html\\\’, {\\\’msg\\\’:\\\’密码未填写或格式有问题\\\’}) else: pass #返回404页面 template的修改
1.静态文件配置:{% static \\\’name\\\’ %} 2.url的配置:{% url \\\’name\\\’ %} 3.错误信息提示: <div class=”error btns” id=”jsforgettips”>{% for key,error in forgetpwd_form.errors.items %}{{ error }}{% endfor %}</div> 4.错误信息聚焦: <div class=”form-group marb20 {% if forgetpwd_form.errors.email %}errorput{% endif %}”> 5.值回填 <input type=”text” id=”account” name=”email” value=”{{ forgetpwd_form.email.value }}” placeholder=”邮箱” /> 用户退出
用户退出
前端配置“注销按钮”的触发逻辑:单机“退出”跳转至user_loginout的url中
<a class=”fr” href=”{% url \\\’user_loginout\\\’ %}”>退出</a> 在url中定义好视图逻辑
url(r\\\’^loginout/$\\\’, logout_view, name=\\\’user_loginout\\\’), 在view中定义好logout_view函数的逻辑,利用系统logout函数清除request的登陆信息
from django.contrib.auth import authenticate,login,logout def logout_view(request): logout(request) return render(request, \\\’index.html\\\’, {}) # 登陆成功,由后台渲染跳转至index,并在index中判断,头部显示
如果,你对上面的内容还有疑问,推荐选择西部数码企业云邮箱!有专人协助您解答邮箱疑问。
西部数码优质企业邮箱服务商,提供安全稳定,简单易用,高性价比的企业邮箱。按需自由定制,不限空间,极速收发,能够满足用户对企业邮箱的不同需求。多种反垃圾邮件算法,99.9%精准度,智能过滤,减少垃圾邮件干扰。支持小程序收发邮件,随时随地移动办公。而且价格实惠,还可以免费试用,7×24小时专业团队服务支持!
高性价比企业邮箱开通链接:https://www.west.cn/services/mail/
旧域名抢注北京web服务器托管云空间网站突然打不开请排查原因并修复不能新增网站备案-备案平台已启动网站无法选择数据库百度云服务器是怎么重启的核验照 幕布-备案平台建网站需合乎哪些原则