使用itsdangerous生成确认令牌
数据库分配的id,用dump转化成令牌字符串,发送带有token的链接的邮件,点击这个链接,执行带token的确认路由,在视图函数中使用user的自定义方法解析loads的id来对照用户的id,如果一样,更改用户的属性。
C:\Users\Geek Lee\Geek-Lee.github.io>venv\Scripts\activate
(venv) C:\Users\Geek Lee\Geek-Lee.github.io>python manage.py shell
>>> from manage import app
>>> from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
>>> s = Serializer(app.config['SECRET_KEY'], expires_in = 3600)
###Serializer类接收参数为一个密钥,可以设置过期时间创建一个s实例
>>> token = s.dumps({
'confirm':23})
###s实例中的dumps方法为数据生成加密签名
>>> token
b'eyJpYXQiOjE0NzQ5NjA0OTcsImV4cCI6MTQ3NDk2NDA5NywiYWxnIjoiSFMyNTYifQ.eyJjb25maXJ
tIjoyM30.0_iOWz78DkZUvTFql868h2dGG2-z00cFc3wVVoMKjZU'
>>> data = s.loads(token)
#loads方法解析加密签名
>>> data
{
'confirm': 23}
#性质为一个字典
>>> data.get('confirm')
23
>>> data['confirm']
23
#可以通过以上两个方法获得
>>>
一.重新定义用户模型
flasky/app/models.py
from werkzeug.security import generate_password_hash, check_password_hash
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
###从itsdangerous包中引入加密类TimedJSONWebSignatureSerializer命名为Serializer
from flask import current_app
###从flask导入现在运行的程序current_app
from flask_login import UserMixin
from . import db, login_manager
###从本级目录中的__init__.py引入正在使用的数据库实例
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role', lazy='dynamic')
def __repr__(self):
return '<Role %r>' % self.name
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean, default=False)
###增加confirmed属性,默认为False,意思为未确认的账户
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
def generate_confirmation_token(self, expiration=3600):
#增加generate_confirmation_token方法,用来生成用户的id的加密签名
s = Serializer(current_app.config['SECRET_KEY'], expiration)
#先产生个Serializer类的实例,里面设置好密钥和过期时间
return s.dumps({
'confirm': self.id})