我试图将电子邮件重新发送给尚未确认其帐户的任何人。
models.py
class Subscribers(Base):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(50))
confirmed = db.Column(db.Boolean(), default=False)
def confirm(self, token):
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(token)
except:
return False
if data.get('confirm') != self.id:
return False
self.confirmed = True
db.session.add(self)
return True
def generate_confirmation_token(self, expiration=3600):
s = Serializer(app.config['SECRET_KEY'], expiration)
return s.dumps({'confirm': self.id})
def get_token(self, expiration=1800):
s = Serializer(app.config['SECRET_KEY'], expiration)
return s.dumps({'email': self.id}).decode('utf-8')
@staticmethod
def verify_token(token):
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(token)
except:
return None
id = data.get('email')
if id:
return User.query.get(id)
return None
这是确认过程处理的功能:
@app.route('/send-confirmation/<email>/<token>')
def confirm(token,email):
subre = Subscribers.query.filter_by(email=email).first()
if subre.confirmed:
flash('Э.почта уже подтверждена.')
return redirect(url_for('index'))
if subre.confirm(token):
subre.confirmed = True
db.session.add(subre)
db.session.commit()
send_email(subre.email, 'Благодарим Вас за подписку на наш сайт', 'auth/subscribe/thanks', subre=subre, token=token)
flash('Вы подтвердили свою электронную почту, спасибо!')
else:
flash('Ссылка для подтверждения является недействительным или истек.')
return redirect(url_for('index'))
告诉我现在一切正常,我试图通过向他们发送另一封要求他们确认帐户的消息来获取尚未确认的每个帐户,这是功能:
@app.before_request
def resend_confirmation():
subscribers = Subscribers.query.filter_by(confirmed=False)
for sub in subscribers:
email = sub.email
token = email.generate_confirmation_token()
send_email(email, 'Подтверждение по электронной почте было отправлено Вам по электронной почте.',
'auth/email/resend', email=email, token=token)
这里收到错误说:
AttributeError: 'unicode' object has no attribute 'generate_confirmation_token'
我试图在模型中添加__unicode__
功能,但没有用。
请任何帮助。
答案 0 :(得分:1)
您正尝试在电子邮件上调用generate_confirmation_token方法,但您应该使用Subscribers实例:
@app.before_request
def resend_confirmation():
subscribers = Subscribers.query.filter_by(confirmed=False)
for sub in subscribers:
token = sub.generate_confirmation_token()
send_email(sub.email, 'Подтверждение по электронной почте было отправлено Вам по электронной почте.',
'auth/email/resend', email=email, token=token)