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编程开发之类型转换convert实例分析
Nov 13 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
softmax及python实现过程解析
Sep 30 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
Python代码风格与编程习惯重要吗?
Jun 03 Python
Python一些基本的图像操作和处理总结
Jun 23 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中eclipse 用空格替换 tab键
2013/06/24 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php按单词截取字符串的方法
2015/04/07 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
pycharm快捷键汇总
2020/02/14 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书