知识点应用:标签绑定事件,jQuery获取用户值--》AJAX发送数据--》后台路由系统--》业务逻辑处理--》ORM数据操作--》write返回--》AJAX回调函数接收--》页面效果显示

第一步:我们要给前端的获取验证码按钮绑定一个onclick事件--发送邮件验证码

  • 找到views下home  index.html找到标签,onclick=SendCode(this)
  • 定义事件,获取邮箱,发送ajax请求

  jQuery代码如下:

function SendCode(this){
var email = $(#xiang).val();
$.ajax({
url:'/send_code',
type:'POST',
data:{em:email},#后台只获取em
success:function(arg){#拿到这个值
console.log(arg);
},
error:function(){ }
})
}
  • 发送请求后,后台就要接收数据了,首先要先到路由系统里配置url
    • 配置好后,接下来就是业务逻辑,找到controllers  account编写SendCodeHandler类
class SendCodeHandler(BaseRequestHandler):

    def post(self,*args,**kwargs):
#定制信息
ret = {"status":True,"data":"","error":""}
email = self.get_argument('em',None)
if email:
#如果有值,生成随机验证码,并发送邮箱
code = commons.randon_code()
message.email([email,],code) #创建session连接
conn = chouti_orm.session()
#生成临时表对象,并写入到临时表
obj = chouti_orm.SendCode(email=email,code=code,stime=datetime.datetime.now())
conn.add(obj)
conn.commit()
self.write(json.dumps(ret))#转成字符串
else:
#如果没有,就改变False状态,加上错误信息
ret["status"] = False
ret["error"] = "邮箱格式错误"
self.write(json.dumps(ret))

在上面这个过程中,由于用到临时存储的临时表,所以我们要在chouti_orm.py定义一个SendCode类做为临时表

class SendCode(Base):

    __tablename__ = "sendcode"

    #注册时验证码信息
nid = Column(Integer, primary_key=True, autoincrement=True)
email = Column(String(32),index=True)
code = Column(String(6))
# status = Column(Integer) #状态码,0表示未注册,1成功,2拉黑
#验证码的有效时间
stime = Column(TIMESTAMP) #发送时间

ajax的回调函数接收到数据后,js处理把应有的效果显示到页面上

第二步:点击注册,携带填写信息进行验证

  • 给注册的标签绑定SubmitRegister事件,并且给要提交信息的标签绑定一个特定的class
  • 事件里,注册状态的变更,发送ajax请求
    function SubmitRegister(ths){
    $(ths).children(':eq(0)').addClass('hide');
    $(ths).addClass('not-allow').children(':eq(1)').removeClass('hide');
    // 发送Ajax请求 //获取用户输入的所有内容(定义一个特定的class或自定义属性)
    var post_dict = {}
    $(".regiter_temp").each(function(){
    var input_val = $(this).val();
    var name_val = $(this).attr("name");
    post_dict[name_val]=input_val;
    })
    console.log(post_dict);
    //发送ajax请求
    $.ajax({
    url:"/register",
    type:"POST",
    data:post_dict,
    success:function(arg){
    console.log(arg);
    //arg是字符串
    var obj = JSON.parse(arg);
    if(obj.status){
    //注册成功---跳转(已登录状态--session实现)
    location.href = "/index";
    }else{
    alert(obj.error);
    }
    }
    }) //完成之后 $(ths).removeClass('not-allow').children(':eq(1)').addClass('hide');
    $(ths).children(':eq(0)').removeClass('hide');
    }

    根据用户提交过来的信息到临时表(验证码表)里进行筛选,注册成功就session保存登陆状态

    class RegisterHandler(BaseRequestHandler):
    
        def post(self, *args, **kwargs):
    ret = {"status":True,"data":"","error":""}
    #获取用户输入的所有内容
    #code = sendcode 匹配 邮箱
    #注册
    #conn.add(obj)
    #conn.commit()
    conn = chouti_orm.session() #创立连接
    #根据用户提交过来的验证码和邮箱 到 临时表里去筛选
    r = conn.query(chouti_orm.SendCode).filter(code=123,email='').first()
    if not r:
    #如果没有,返回错误信息
    ret['status'] = False
    ret["error"] = "邮箱验证码错误"
    self.write(json.dumps(ret))
    else:
    #临时表里有,就注册成功,实例用户信息对象,跟新到userinfo表里
    obj = chouti_orm.UserInfo()
    conn.add(obj)
    conn.commit()
    #session保存用户登陆状态
    self.session["is_login"] = True
    #保存用户
    self.session['username'] = '用户输入的用户名'
    self.write(json.dumps(ret))
    • ajax回调函数接收数据,注册成功就跳转到首页,并显示登陆状态

      你们可能有疑问,好像注册时没对邮箱是否已经注册进行验证,对吧,这里可以在填邮箱的标签定义onblur事件--发送ajax请求,到后台去userinfo表进行检测并且返回结果就可以了

抽屉之Tornado实战(3)--注册的更多相关文章

  1. 抽屉之Tornado实战(1)--分析与架构

    抽屉之Tornado实战(1)--分析与架构   项目模拟地址:http://dig.chouti.com/ 知识点应用: AJAX  用于偷偷发请求 原生ajax jQuery  ajax($.aj ...

  2. 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证

    当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...

  3. 抽屉之Tornado实战(7)--form表单验证

    在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class Base ...

  4. 抽屉之Tornado实战(6)--session工厂(工厂方法模式)

    我之前写的session一般保存在服务器的内存里,那可以保存在缓存,或是数据库,那问题来了,不同地方,保存方式是不同的,所以需要定义不同的类,cache/redis/memcached类 sessio ...

  5. 抽屉之Tornado实战(5)--点赞与评论树

    点赞 点赞的过程:数字增加,并在后台点赞表记录数据 需要发过去的数据:用户id,新闻id 用户id从session里获得,那新闻id怎么获取呢?这想到分页是循环新闻列表来展示内容,循环的新闻id可以做 ...

  6. 抽屉之Tornado实战(4)--发帖及上传图片

    对于链接,点击获取标题时,本质发送ajax请求,然后去链接抓取信息,发布又是发送ajax请求 发布信息,还要有发布者的信息,并在信息表需要记录发布者的用户名,发布者的头像,发布者的id,而这些信息可以 ...

  7. 抽屉之Tornado实战(2)--数据库表设计

    经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 #一张表对应一个类 class ...

  8. Tornado实战

    抽屉之Tornado实战(1)--分析与架构 抽屉之Tornado实战(2)--数据库表设计 抽屉之Tornado实战(3)--注册 抽屉之Tornado实战(4)--发帖及上传图片 抽屉之Torna ...

  9. Tornado实战项目(伪JD商城)

    预备知识 在之前tornado商城项目中,在开始之前需要引入一些项目设计知识,如接口,抽象方法抽象类,组合,程序设计原则等,个人理解项目的合理设计可增加其灵活性, 降低数据之间的耦合性,提高稳定性,下 ...

随机推荐

  1. Xmpp获取离线消息

    文章只是选取了其中一段,无XMPP基础的人可能看起来有点复杂; 假设我们注册了一个用户,用户名叫shimiso,那么我们如何让shimiso这个用户一登陆就取到离线消息呢? PPConnection. ...

  2. Python3自定义http/https请求拦截mitmproxy脚本

    [本文出自天外归云的博客园] 脚本内容 代码如下: from mitmproxy import http, ctx from multiprocessing import Lock class Fil ...

  3. IntellIJ IDEA 配置 Vue 支持 打开Vue项目

    [参考]零基础 Vue 开发环境搭建 打开运行Vue项目 IDEA版本: IntelliJ IDEA 2017.2 Windows 7 X64 IntelliJ IDEA下载地址:https://ww ...

  4. linux dns 工具包 -- bind-utils

    https://www.cnblogs.com/274914765qq/p/4817941.html

  5. [React] 13 - Redux: react-redux

    Ref: Redux 入门教程(三):React-Redux 的用法 组件拆分规范 使用 React-Redux,需要掌握额外的 API,并且要遵守它的组件拆分规范. React-Redux 将所有组 ...

  6. 中文数据解码报错 UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

    UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence 失败原因: ...

  7. DLL断点调试

    一般来说调试DLL是把DLL工程和exe工程放到一个解决方案里.如果不放到一个解决方案里,那两者的输出目录要一致,属性-连接器-常规-输出目录.保证dll,dll的pdb,exe,exe的pdb在一个 ...

  8. 英文写作强调技巧:alliteration, assonance, consonance

    alliteration 安排两个以上首字母相同的词相邻 例: The bouncing ball went high into the sky. (In this example, the &quo ...

  9. Linux下coreseek环境安装 、mysql数据源、sphinx扩展安装及php调用

    一.安装m4-1.4.13.autoconf-2.64.automake-1.11.libtool-2.2.6 下载安装m4-1.4.13.autoconf-2.64.automake-1.11.li ...

  10. 微信小程序:bindtap等事件传参

    事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如 id, data ...