用户认证(四)【确认账户】

这篇博客详细介绍了如何使用itsdangerous生成确认令牌,用于用户账户的确认过程。内容涵盖从重新定义用户模型,实现能发送确认邮件的注册路由,到处理点击邮件中的带token确认链接的视图函数,以及在全局请求前过滤未确认账户的before_app_request处理程序。还涉及到重新发送确认邮件的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

使用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})
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值