Python通过Django实现用户注册和邮箱验证功能代码


Posted in Python onDecember 11, 2017

本文主要向大家分享了Python编程中通过Django模块实现用户注册以及邮箱验证功能的简单介绍及代码实现,具体如下。

用户注册:

类似于用户登陆,同样在users.views.py中添加RegisterView(View)类,其中对表单的get和post作出处理。
如果是get方法,重新返回register页面让用户进行填写。

def get(self, request):
  register_form = RegisterForm()
  return render(request, "register.html", {'register_form':register_form})

method = POST时,用户注册逻辑:

def post(self, request):
  # 实例化form,验证每个字段是否合法
  register_form = RegisterForm(request.POST)
  pre_check = register_form.is_valid()
  if pre_check:
   # 取出email和password
   user_name = request.POST.get("email", "")
   pass_word = request.POST.get("password", "")
   # 实例化用户,然后赋值
   user_profile = UserProfile()
   user_profile.username = user_name
   user_profile.email = user_name
   # 新建用户为非活跃用户,可通过验证变为活跃用户
   user_profile.is_active = False
   # 将明文转换为密文赋给password
   user_profile.password = make_password(pass_word)
   user_profile.save() # 保存到数据库
   # 此处加入了邮箱验证的手段
   send_register_email(user_name, "register")
   return render(request, "login.html")
  else:
   # form表单验证失败,将错误信息传给前端
   return render(request, "register.html", {"register_form": register_form})

在form.py中添加RegisterForm类对给出表单处理类:

class RegisterForm(forms.Form):
 # 不能为空
 email = forms.EmailField(required=True)
 password = forms.CharField(required=True, min_length=6, max_length=20)
 # 出错信息
 captcha = CaptchaField(error_messages={"invalid":u"验证码错误"})

以下为对应的前端代码,其中添加了了django的模版用法,均以{% %}的形式在html中加入逻辑, 避免了python代码的直接插入,方便维护和修改。

<form id="email_register_form" method="post" action="{% url 'register' %}" autocomplete="off">
      <div class="form-group marb20 {% if register_form.errors.email %}errorput{% endif %}">
       <label>邮     箱</label>
       <input type="text" id="id_email" name="email" value="{{ register_form.email.value }}" placeholder="请输入您的邮箱地址" />
      </div>
      <div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
       <label>密     码</label>
       <input type="password" id="id_password" name="password" value="{{ register_form.password.value }}" placeholder="请输入6-20位非中文字符密码" />
      </div>
      <div class="form-group marb8 captcha1 {% if register_form.errors.captcha %}errorput{% endif %}">
       <label>验 证 码</label>
       {{ register_form.captcha }}
      </div>
      <div class="error btns" id="jsEmailTips">{% for key,error in register_form.errors.items %}{{ error }}{% endfor %} {{ msg }}</div>
      <div class="auto-box marb8">
      </div>
      <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
      {% csrf_token %}
     </form>

{% csrf_token %}是django为了在用户提交表单时防止跨站攻击所做的保护,在表单最后没有加入的话,不能正常提交
表单中有一项为验证码,在django中可以使用django-simple-captcha模块实现:

url(r'^captcha/', include(‘captcha.urls')) 配置url
{{ register_form.captcha }} 配置前端

邮箱验证:

在users.py中添加了邮箱验证的model:

class EmailVerifyRecord(models.Model):
 # 验证码
 code = models.CharField(max_length=20, verbose_name=u"验证码")
 email = models.EmailField(max_length=50, verbose_name=u"邮箱")
 # 包含注册验证和找回验证
 send_type = models.CharField(verbose_name=u"验证码类型", max_length=10, choices=(("register",u"注册"), ("forget",u"找回密码")))
 send_time = models.DateTimeField(verbose_name=u"发送时间", default=datetime.now)
 class Meta:
  verbose_name = u"邮箱验证码"
  verbose_name_plural = verbose_name
 def __unicode__(self):
  return '{0}({1})'.format(self.code, self.email)

在setting.py中添加配置邮箱信息:

EMAIL_HOST = "smtp.163.com" # 服务器
EMAIL_PORT = 25    # 一般情况下都为25
EMAIL_HOST_USER = "abc@163.com" # 账号
EMAIL_HOST_PASSWORD = "password" # 密码
EMAIL_USE_TLS = False    # 一般都为False
EMAIL_FROM = "abc@163.com"  # 邮箱来自

创建utils包,新建email_send .py

from random import Random # 用于生成随机码 
from django.core.mail import send_mail # 发送邮件模块
from users.models import EmailVerifyRecord # 邮箱验证model
from MxOnline.settings import EMAIL_FROM # setting.py添加的的配置信息
# 生成随机字符串
def random_str(randomlength=8):
 str = ''
 chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
 length = len(chars) - 1
 random = Random()
 for i in range(randomlength):
  str+=chars[random.randint(0, length)]
 return str
def send_register_email(email, send_type="register"):
 email_record = EmailVerifyRecord()
 # 将给用户发的信息保存在数据库中
 code = random_str(16)
 email_record.code = code
 email_record.email = email
 email_record.send_type = send_type
 email_record.save()
 # 初始化为空
 email_title = ""
 email_body = ""
 # 如果为注册类型
 if send_type == "register":
  email_title = "注册激活链接"
  email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)
  # 发送邮件
  send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
  if send_status:
   pass

然后将用户变为活跃用户,加入相关的view:

class ActiveUserView(View):
 def get(self, request, active_code):
 # 用code在数据库中过滤处信息
  all_records = EmailVerifyRecord.objects.filter(code=active_code)
  if all_records:
   for record in all_records:
    email = record.email
    # 通过邮箱查找到对应的用户
    user = UserProfile.objects.get(email=email)
    # 激活用户
    user.is_active = True
    user.save()
      else:
   return render(request, "active_fail.html")
  return render(request, "login.html")

配置生成页面的url:

url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name="user_active"), # 提取出active后的所有字符赋给active_code

至此,便可将is_active加入到登陆的限制当中:

if user.is_active:
     login(request, user) # 调用login方法登陆账号
     return render(request, "index.html")
    else:
     return render(request, "login.html", {"msg": u"用户未激活"})

总结

以上就是本文关于Python通过Django实现用户注册和邮箱验证功能代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python解析html开发库pyquery使用方法
Feb 07 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
Python对列表的操作知识点详解
Aug 20 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
Python实现冒泡排序的简单应用示例
Dec 11 #Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 #Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 #Python
让Python更加充分的使用Sqlite3
Dec 11 #Python
pandas中Timestamp类用法详解
Dec 11 #Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 #Python
python实现二叉树的遍历
Dec 11 #Python
You might like
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
纽约海:Sea New York
2018/11/04 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
医疗纠纷协议书
2014/04/16 职场文书
五四青年节演讲稿
2014/05/26 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
合作意向协议书
2015/01/29 职场文书
工作后的感想
2015/08/07 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
Go并发4种方法简明讲解
2022/04/06 Golang
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript