博客-注册功能
前台界面 ,很丑陋,对css 比较麻木 就这样了。

需求:
1 手机号码只能注册一次,
2 用户名不能想通,密码长度为8-15之间,前台不校验了 ,直接用WTForms 验证。
3 两次密码要一致 ,直接用js 比较
4 注册成功跳转到 新页面
这里不用wtforms 渲染模版了,因为通常页面都是前端提供,他们不会去了解 wtform 渲染页面,我们也没有必要拿前端的页面 再用 wtform 改造。所以我也只是了解。
这里没有结合蓝图了。直接把业务代码写在了app主文件里面了。
首先定义好模型,新建 model.py
1 from exts import db 2 from datetime import datetime 3 from werkzeug.security import generate_password_hash,check_password_hash 4 5 class User(db.Model): 6 __tablename__='user' 7 id=db.Column(db.Integer,primary_key=True,autoincrement=True) 8 telephthon=db.Column(db.String(15),nullable=False) 9 name=db.Column(db.String(15),nullable=False) 10 passwd=db.Column(db.String(50),nullable=False) 11 12 13 def __init__(self,telephthon,name,passwd): 14 self.telephthon=telephthon 15 # self.birthday=birthday 16 self.passwd=passwd 17 self.name=name
定义表单类 forms.py:
1 #encoding:utf-8 2 import sys 3 reload(sys) 4 sys.setdefaultencoding('utf-8') 5 from wtforms import Form,StringField,IntegerField 6 from wtforms.validators import Length,EqualTo,Email,InputRequired,NumberRange,ValidationError 7 import re 8 class RegisterForm(Form): 9 # 对于电话号码, wtforms 没有提供验证器 所以需要我们自己实现一个电话号码的验证器(自定义验证器) 10 telephone=StringField(validators=[Length(max=15)]) 11 username=StringField(validators=[Length(max=15)]) 12 password1=StringField(validators=[Length(min=8,max=50)]) 13 password2 = StringField(validators=[Length(min=8,max=50),EqualTo('password1')]) 14 15 # 这里是自定义的验证方法(验证器) 16 # 规则 validate_字段名 ,当对telephone 验证时,会自动调用者个方法 .主要验证手机的长度 17 def validate_telephone(self,field): 18 print "+++++++++++++++++++++++++++++++++++" 19 print type(field),type(field.data),field.data 20 str=field.data 21 print '-------',str,'----------' 22 matchObj = re.match(r'1[3587]\d{9}$',str,re.I) //通过正则表达式验证 验证手机号码,不严谨 主要是学习自定义验证器的使用方法。 23 if matchObj: 24 # 如果是电话号码就什么也不做,不返回提示了。 25 pass 26 else: 27 # 如果不是电话号码 就ValidationError 方法提示 。 28 raise ValidationError('It\'s not a phone number')
前台页面:
{% extends 'basic.html' %} // 继承模版 {% block title %} <title>简博客-注册用户</title> {% endblock %} {% block staticfile %} <script src="{{ url_for('static',filename='js/register.js') }}"></script> {% endblock %} {% block body %} <div class="container"> <div class="row" style="margin-top: 20px;"> <!-- 登录窗口--> <div class="col-md-offset-4"> <div class="form-horizontal"> <div class="form-group"> <label for="username" class="col-sm-2 control-label">手机号</label> <div class="col-sm-4"> <input type="text" class="form-control" name="telephone" id="telephone" placeholder="手机号码"> </div> </div> <div class="form-group"> <label for="username" class="col-sm-2 control-label">用户名</label> <div class="col-sm-4"> <input type="text" class="form-control" name="username" id="username" placeholder="用户名"> </div> </div> <div class="form-group"> <label for="inputPassword1" class="col-sm-2 control-label">密码</label> <div class="col-sm-4"> <input type="password" class="form-control" name="password1" id="password1" placeholder="密码" data-container="body" data-toggle="popover" data-placement="right" data-content="密码不能为空"> </div> </div> <div class="form-group"> <label for="inputPassword2" class="col-sm-2 control-label">确认密码</label> <div class="col-sm-4"> <input type="password" class="form-control" name="password2" id="password2" placeholder="确认密码"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button id="btn" type="button" class="btn btn-primary">登录</button> </div> </div> </div> </div> </div> </div> {% endblock %}
需求1: 手机号码只能注册一次,
$('#telephone').mouseout(function () { // 这里有个问题 如果使用table键切换的话,mouseout事件就不会触发,用户名,密码这些校验就不会及时提示。也算是小bug,所以最好是找现成的插件改吧改吧
var tphone=$('#telephone').val();
$.get('/gettPhone',{"tphone":tphone},function (data) {
if(data=='1'){
alert('手机号码已经注册');
return false;
}
})
})
视图方法:
@app.route('/gettPhone',methods=['GET']) def gettPhone(): tphone=request.args.get('tphone'); print '---------',tphone u=User.query.filter(User.telephthon==tphone).first() if u: return str(1) else: return str(0)
需求2: 用户名不能相同,密码长度为8-15之间,前台不校验了 ,直接用WTForms 验证。
$('#username').mouseout(function () {
var uname=$('#username').val();
$.get('/getUesr',{"uname":uname},function (data) {
if(data=='1'){
alert('用户已经注册');
return false;
}
})
})
视图方法
@app.route('/getUesr',methods=['GET']) def getUesr(): uname=request.args.get('uname'); print '---------',uname u=User.query.filter(User.name==uname).first() if u: return str(1) else: return str(0)
需求3: 两次密码要一致 ,直接用js 比较
var passwd1=$('#password1').val(); var passwd2=$('#password2').val(); if(passwd1!=passwd2){ alert('两次输入的密码不一致') return false; }
需求4 :注册成功跳转到 新页面
$('#btn').click(function () {
var tphone=$('#telephone').val();
var name=$('#username').val();
var passwd1=$('#password1').val();
var passwd2=$('#password2').val();
if(passwd1!=passwd2){
alert('两次输入的密码不一致')
return false;
}
if(tphone==''||name==''||passwd1==''){
alert('有信息没有输入完成')
return false;
}
$.ajax({
type: "POST",
url: "/register",
data: "telephone="+tphone+"&"+"username="+name+"&"+"password1="+passwd1+"&"+"password2="+passwd2,
success:function(data){
setTimeout(function () {
alert('注册成功!'+data);
window.location.href='/' //注册成功1.5秒后跳转到首页
}, 1500);
}
})
})
浙公网安备 33010602011771号