我一直在关注Corey Schafer 在基本烧瓶博客上的精彩 youtube 教程。除了 Corey 的代码,我想添加一个逻辑,用户必须在登录之前验证他们的电子邮件地址。我已经想用来自 itsdangerous 的 URLSafeTimedSerializer 来做到这一点,就像prettyprinted 在这里所建议的那样. 整个令牌创建和验证过程似乎有效。不幸的是,由于我对 python 的了解非常新鲜,我自己无法弄清楚如何将其保存到 sqlite3 数据库中。在我的模型中,我创建了一个带有 default=False 的布尔列 email_confirmed,我打算在验证过程之后将其更改为 True。我的问题是:当他点击他的自定义网址时,我如何最好地识别用户(为谁更改 email_confirmed 列)?将令牌保存在 db 列中然后按该令牌过滤以识别用户是否是一种好习惯?
以下是一些相关代码:
我的 modely.py 中的用户类
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default_profile.jpg')
password = db.Column(db.String(60), nullable=False)
date_registered = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
email_confirmed = db.Column(db.Boolean(), nullable=False, default=False)
email_confirm_date = db.Column(db.DateTime)
projects = db.relationship('Project', backref='author', lazy=True)
def get_mail_confirm_token(self, expires_sec=1800):
s = URLSafeTimedSerializer(current_app.config['SECRET_KEY'], expires_sec)
return s.dumps(self.email, salt='email-confirm')
@staticmethod
def verify_mail_confirm_token(token):
s = URLSafeTimedSerializer(current_app.config['SECRET_KEY'])
try:
return s.loads(token, salt='email-confirm', max_age=60)
except SignatureExpired:
return "PROBLEM"
我的路线中的注册逻辑(使用用户蓝图):
@users.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('dash.dashboard'))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user = User(username=form.username.data, email=form.email.data, password=hashed_password)
db.session.add(user)
db.session.commit()
send_mail_confirmation(user)
return redirect(url_for('users.welcome'))
return render_template('register.html', form=form)
@users.route('/welcome')
def welcome():
return render_template('welcome.html')
@users.route('/confirm_email/<token>')
def confirm_email(token):
user = User.verify_mail_confirm_token(token)
current_user.email_confirmed = True
current_user.email_confirm_date = datetime.utcnow
return user
最后一部分current_user.email_confirmed = True,current_user.email_confirm_date =datetime.utcnow可能是有问题的行。如上所述,由于用户在此阶段尚未登录,因此未进行所需的条目。我很感激这方面的任何帮助!提前非常感谢!