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实现Tab自动补全和历史命令管理的方法
Mar 12 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
实例Python处理XML文件的方法
Aug 31 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python高级特性与几种函数的讲解
Mar 08 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
python的range和linspace使用详解
Nov 27 Python
Python中包的用法及安装
Feb 11 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 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
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
车间调度岗位职责
2013/11/30 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
安全演讲稿大全
2014/05/09 职场文书
教师求职简历自我评价
2015/03/10 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL