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

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

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

  jQuery代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function SendCode(this){
    var email = $(#xiang).val();
    $.ajax({
        url:'/send_code',
        type:'POST',
        data:{em:email},
        success:function(arg){
            console.log(arg);
        },
        error:function(){
 
        }
    })
}
  • 发送请求后,后台就要接收数据了,首先要先到路由系统里配置url

  • 配置好后,接下来就是业务逻辑,找到controllers  account编写SendCodeHandler类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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类做为临时表

1
2
3
4
5
6
7
8
9
10
11
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请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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保存登陆状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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='111').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)--分析与架构

    项目模拟地址:http://dig.chouti.com/ 知识点应用: AJAX  用于偷偷发请求 原生ajax jQuery  ajax($.ajax) iframe伪造 上传文件 传统Form ...

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

    经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 ? 1 2 3 4 5 6 7 ...

  3. Android项目实战登录&注册

    由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...

  4. Android项目实战登录&注册

    由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...

  5. KotlinMall实战之注册部分MVP架构配置

    包目录如下: ①BaseView部分:基本的回调 interface BaseView { fun showLoading() fun hideLoading() fun onError()} ②Ba ...

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

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

  7. java入门第五步之数据库项目实战【转】

    在真正进入代码编写前些进行一些工具的准备: 1.保证有一个可用的数据库,这里我用sql server 2000为例,2.拥有一个ide,如ecelise或myeclipse等,这里我使用的是myecl ...

  8. tornado框架之路一

    Web 服务器 每个页面都以 HTML 的形式传送到你的浏览器中,HTML 是一种浏览器用来描述页面内容和结构的语言.那些负责发送 HTML 到浏览器的应用称之为“Web 服务器”,会让你迷惑的是,这 ...

  9. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了

    原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...

随机推荐

  1. PostgreSQL归档日志 手动触发归档 select pg_switch_xlog()

    (转,做记录) 一 环境信息--1.1 PostgreSQL 版本 9.3.0 --1.2 postgresql.conf wal_level = hot_standbyarchive_mode = ...

  2. 一个 token 控件

    用于以分词形式显示某个对象的多个标签,比如: 用法 将 TagsView.h/.m 文件拷贝到你的项目文件夹,在需要用到该控件的地方导入 TagsView.h 头文件. IB 中的工作 拖一个 UIV ...

  3. Leetcode 1018. Binary Prefix Divisible By 5

    class Solution: def prefixesDivBy5(self, A: List[int]) -> List[bool]: ans,t = [],0 for a in A: t ...

  4. How to use NSRequest in Delphi XE4

    //Demo How to use NSRequest..procedure TiOSWebBrowserService.DoNavigate(const URL: string);var NewUR ...

  5. golang日期转字符串,仿照C#中的日期格式结构体

    1.日期格式集合.日期转字符串方法 package util import ( "strings" "time" ) //日期格式:模仿java中的结构体 ty ...

  6. libwebsockets 运行问题

    /****************************************************************************** * libwebsockets 运行问题 ...

  7. 如何快速上手.net下单元测试工具NUnit?

    NUnit基本使用 准备知识: 读此博文需要了解单元测试基本概念及NUnit的的安装. 传送门:单元测试之道(使用NUnit) 1.常见的错误 当学习一个新东西时,先学习错误,是最快的方式. 1.1 ...

  8. 利用 Excel 写 C51 的宏定义

    利用 Excel 写 C51 的宏定义 填好占空比,自动生成宏. #define LIGHT_LEVEL_00 0xFF #define LIGHT_LEVEL_10 0xE5 #define LIG ...

  9. YUV

    https://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx

  10. iPhone之IOS5内存管理(ARC技术概述)

    ARC(Automatic Reference Counting )技术概述 此文章由Tom翻译,首发于csdn的blog,任何人都可以转发,但是请保留原始链接和翻译者得名字.多谢! Automati ...