说起来web程序中的用户注册是非常简单了。主要包括用户注册和验证邮箱两步。
1.用户注册
用户注册主要包括三个信息,一是用户名,二是密码 ,三是邮箱。
用户名需要验证字段值和字段长度的限制。可以用正则表达式Regexp验证字段值是否合法。比如只允许由英文字母和数字组成,可以使用Regexp("︿[a-zA-Z0-9]*$",message=“The username should contain only a-z,A-Z,and 0-9”);验证。长度可以使用Length(1,X)验证。再则,用户名不可以重复,要使用自定义验证函数验证。比如
def validate_username(self,field):
if User.query.filter(username=field.data).first():
raise ValidationError('The username is already in use')
2.密码
为了防止密码输错,一般密码要求输入两遍password、password2,在password中使用EqualTO(‘password2’)验证器来验证。密码的值域也可以使用Regexp正则表达式来验证,长度同上。
3.邮箱
邮箱不能够重复,验证方法同用户名的重复验证方法。邮箱还要发送邮件进行真实性验证。
在向已填写的邮箱发送确认的URl时因为涉及到信息的保密和防止用户直接 登录相应的url绕过验证,要用到令牌,只有使用邮箱接收到令牌才可以进行验证。现在常用的是利用JWT技术,即对json数据进行签名。其核心为itsdangerous函数。
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import BadSignture,SigntureExpired
from flask import current_app
from *.extensions import db
def generate_token(user,expire_in=600):
s=Serializer(current_app.config['SECRET_KEY',expire_in])
data={"id":"user.id"}
return s.dumps(data)
def validate_token(user,token):
s=Serializer(current_app.config['SECRET_KEY'])
try:
data=s.loads(token)
except (SignatureExpired,BadSignture):
return False
if user.id=data.get('id'):
user.confirmed=True
db.session.commit()
邮箱的验证实质为:首先服务器发送给用户邮箱一个签名了的URL,URL中包含用户的信息(主要是ID),然后用户访问这个URL,服务器首先验证签名,然后根据ID值写入用户的验证状态。