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中自定义函数的可变参数的使用及注意点
Jun 21 Python
Python 基础教程之闭包的使用方法
Sep 29 Python
深入理解Python3 内置函数大全
Nov 23 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
详解python3中的真值测试
Aug 13 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Python容器类型公共方法总结
Aug 19 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
PyQt 如何创建自定义QWidget
Mar 24 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
一个odbc连mssql分页的类
2006/10/09 PHP
php将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
Python中return语句用法实例分析
2015/08/04 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
django之常用命令详解
2016/06/30 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
python实现飞机大战
2018/09/11 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
python 画函数曲线示例
2019/12/04 Python
Python requests设置代理的方法步骤
2020/02/23 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
土建技术员岗位职责
2015/04/11 职场文书
2016年母亲节寄语
2015/12/04 职场文书
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
python​格式化字符串
2022/04/20 Python