8.1.发送邮箱验证码功能

(1)cms/resetemail.html

{%  from 'common/_macros.html' import static %}

{% block head %}
<script src="{{ static('cms/js/resetemail.js')}}"></script>
{% endblock %} <input type="email" name="email" placeholder="新邮箱" class="form-control">
<span class="input-group-addon" id="captcha-btn" style="cursor: pointer">获取验证码</span>

(2)cms/js/resetemail.js

/**
* Created by derekon 2018/6/4.
*/ $(function () {
$("#captcha-btn").click(function (event) {
event.preventDefault();
var email = $("input[name='email']").val();
if(!email){
zlalert.alertInfoToast('请输入邮箱');
}
zlajax.get({
'url': '/cms/email_captcha/',
'data': {'email':email},
'success': function (data) {
if(data['code'] == 200){
zlalert.alertSuccessToast('邮件已发送成功!请注意查收!');
}else{
zlalert.alertInfo(data['message']);
}
},
'fail':function (error) {
zlalert.alertNetworkError();
}
});
});
});

(3)cms/views.py

@bp.route('/email_captcha/')
def email_captcha():
#获取要修改的邮箱
email = request.args.get('email')
if not email:
return restful.params_error('请输入要修改的邮箱')
#得到大小写字母的列表
source = list(string.ascii_letters)
#得到大小写字母的列表 + 0到9的数字字符串
source.extend(map(lambda x: str(x), range(0, 10)))
# 随机取六位作为验证码
captcha = "".join(random.sample(source, 6))
#给这个邮箱发送邮件验证码
message = Message(subject='derek论坛密码修改邮件发送', recipients=[email,], body='你的验证码是:%s'%captcha)
try:
mail.send(message)
except:
return restful.server_error()
return restful.success()

输入邮箱,点“获取验证码”

8.2.修改邮箱功能完成

(1)utils/zlcache.py

把验证码保存到memcached中

# utils/zlcache.py

import memcache

cache = memcache.Client(['139.199.131.146:11211'],debug=True)

def set(key,value,timeout=60):     #过期时间60s
return cache.set(key,value,timeout) def get(key):
return cache.get(key) def delete(key):
return cache.delete(key)

(2)cms/views.py

zlcache.set(email,captcha) 把邮箱和验证码相关联保存到memcached中
@bp.route('/email_captcha/')
def email_captcha():
.
.
.
.
try:
mail.send(message)
except:
return restful.server_error()
#把邮箱和验证码保存到memcached中
zlcache.set(email,captcha)
return restful.success()

(3)cms/forms.py

from utils import zlcache
from wtforms import ValidationError
from flask import g class ResetEmailForm(BaseForm):
email = StringField(validators=[Email(message="请输入正确格式的邮箱")])
captcha = StringField(validators=[Length(min=6,max=6,message='请输入正确的邮箱验证码')])
# 自定义验证
def validate_captcha(self,field):
#form要提交的验证码和邮箱
captcha = field.data
email = self.email.data
#缓存里面保存的邮箱对应的验证码
captcha_cache = zlcache.get(email)
#如果缓存中没有这个验证码,或者缓存中的验证码跟form提交的验证码不相等(不区分大小写)
# 两个有一个不成立,就抛异常
if not captcha_cache or captcha.lower() != captcha_cache.lower():
raise ValidationError('邮箱验证码错误!') def validate_email(self, field):
email = field.data
user = g.cms_user
if user.email == email:
raise ValidationError('不能修改为当前使用的邮箱!')

(4)cms/js/resetemail.js

$(function () {
$("#submit").click(function (event) {
event.preventDefault();
var emailE = $("input[name='email']");
var captcheE = $("input[name='captcha']"); var email = emailE.val();
var captcha = captcheE.val(); zlajax.post({
'url': '/cms/resetemail/',
'data': {'email': email, 'captcha': captcha},
'success': function (data) {
if (data['code'] == 200) {
emailE.val("");
captcheE.val("");
zlalert.alertSuccessToast('恭喜!邮箱修改成功');
} else {
zlalert.alertInfo(data['message']);
}
},
'fail': function (error) {
zlalert.alertNetworkError();
}
});
});
});

(5)cms/views.py

class ResetEmail(views.MethodView):
def get(self):
return render_template('cms/cms_resetemail.html') def post(self):
form = ResetEmailForm(request.form)
if form.validate():
email = form.email.data
g.cms_user.email = email
db.session.commit()
return restful.success()
else:
return restful.params_error(form.get_error())

现在就可以修改邮箱了。

BBS论坛(八)的更多相关文章

  1. Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点

    开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...

  2. python 学习笔记二十 django项目bbs论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  3. Python之路,Day17 - 分分钟做个BBS论坛

    Python之路,Day17 - 分分钟做个BBS论坛   本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...

  4. python第一百三十天 ---简单的BBS论坛

    简单的BBS论坛 实现功能 git仓库地址:https://github.com/uge3/BBS 1.整体参考“抽屉新热榜” + “博客园” 2.实现不同论坛版块 3.帖子列表展示 4.个人博客主页 ...

  5. Django小项目简单BBS论坛

    开发一个简单的BBS论坛 项目需求: 1 整体参考"抽屉新热榜" + "虎嗅网" 2 实现不同论坛版块 3 帖子列表展示 4 帖子评论数.点赞数展示 5 在线用 ...

  6. Python开发一个简单的BBS论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  7. bbs论坛浏览器兼容性问题

    一直都是在chrome上进行调试,今天终于把bbs论坛这个项目搭建完了,进入IE.Firefox看了看 吓哭了!!! 火狐 Edge chrome 特别是加了<!DOCTYPE html> ...

  8. 开源BBS论坛软件推荐

    七款开源BBS论坛软件推荐(1) 本文介绍了七个开源的BBS论坛软件(在英文界一般叫做Forum).可能国内的朋友们比较熟悉Discuz!和PHPwind,但其实我们的选择还是很多的,而且下面介绍的这 ...

  9. LNMP环境搭建BBS论坛及伪静态

    我们在mysql备份 LNMP环境中的数据库迁移为独立的服务器的基础上搭建BBS论坛:  [root@bqh-117 ~]# mysql -uroot -p123456 Welcome to the ...

  10. Django项目 BBS论坛

    BBS论坛 一.项目表分析 二.自定义form组件 三.注册功能 四.BBS论坛 登录功能

随机推荐

  1. GLSL ES 3.0 和 2.0 的区别

    GLSL ES 3.0 和 2.0 的区别 语法区别 attribute和varying. 取而代之的是 in和out 头文件多了个#version 300 es 纹理 texture2D 和 tex ...

  2. VIM系统复制粘贴

    1 需求 系统复制粘贴主要是满足下面两个需求. 在多个对象之间复制粘贴 vim窗口与vim窗口之间 外部界面与vim窗口之间 不变复制粘贴.从外部界面复制粘贴到vim窗口时,文本不发生任何变化. 2 ...

  3. zabbix企业级监控dell硬件服务状态

    监控dell服务的硬件状态,一般有两种方式 第一,在操作熊上安装OMSA,编写脚本调用omreport命令进行监控 第二.使用IDRAC,只需开启在IARAC上的SNMP,zabbix通过snmp进行 ...

  4. 详解 IntelliJ IDEA 配置和启动maven 项目 步骤

    1.本地安装maven 1.1 安装 https://www.cnblogs.com/wkrbky/p/6350334.html?utm_source=itdadao&utm_medium=r ...

  5. Mac安装sqlite3

    1,下载最新版本的 Mac OS X 会预安装 SQLite,但是如果没有可用的安装,只需按照如下步骤进行: 去安装最新的3.8.6版本,和linux的sqlite3安装版本是同一个. 软件地址为:h ...

  6. PCB Mark点相关

    1)Mark点用于锡膏印刷和元件贴片时的光学定位.根据Mark点在PCB上的作用,可分为拼板Mark点.单板Mark点.局部Mark点(也称器件级MARK点) 2)拼板的工艺边上和不需拼板的单板上应至 ...

  7. hadoop tez 结合搭建以及测试异常解决

    hadoop tez 搭建 1.下载tez,本人下载的是bin.0.92版本. http://www.apache.org/dyn/closer.lua/tez/0.9.2/ hadoop dfs - ...

  8. S0.4 二值图与阈值化

    目录 二值图的定义 二值图的应用 阈值化 二值化/阈值化方法 1,无脑简单判断 opencv3函数threshold()实现 2,Otsu算法(大律法或最大类间方差法) OpenCV3 纯代码实现大津 ...

  9. USCiLab cereal json 序列化

    cereal json 序列化 https://blog.csdn.net/sunnyloves/article/details/51373793?utm_source=blogxgwz8 http: ...

  10. ios中getTime()的兼容性问题

    · var getTime = function(time){ var myDate = new Date(time); var u = navigator.userAgent; var isAndr ...