flask forum开发笔记(4)登录注册(下)

上一章中还有一个itsdangerous包没有讲,itsdangerous 包可以用来生成包含用户 id 的安全令牌。因为一般来说确认邮件中最简单的确认链接是 http://www.xxx.com/auth/confirm/<id> 这种形式的URL,其中 id 是数据库分配给用户的数字 id。但是如果被用户识别出了这种格式,那么只需修改id值就可以确认任意的账户,显然这样是违规的。所以这里就需要itsdangerous包来生成一个令牌。

我们可以使用itsdangerous包中的TimedJSONWebSignatureSerializer 类生成具有过期时间的 JSON Web 签名。其中的dumps()方法为指定的数据生成一个加密签名,然后再对数据和签名进行序列化,生成令牌字符串。expires_in参数设置令牌的过期时间,单位为秒。OK,将此功能加入User模型中。

from . import db
from werkzeug.security import generate_password_hash, check_password_hash
from . import login_manager
from flask.ext.login import UserMixin, AnonymousUserMixin
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from flask import current_app

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    ...

    def generate_confirmation_token(self, expiration=3600):
        s = Serializer(current_app.config['SECRET_KEY'], expiration)
        return s.dumps({'confirm': self.id})

    def confirm(self, token):
        s = Serializer(current_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

上面出现了一个loads()方法,这个方法会检验签名和过期时间,如果通过,返回原始数据。如果提供给 loads()方法的令牌不正确或过期了,则抛出异常,其唯一的参数是令牌字符串。

接下来需要做发送确认邮件的功能,当前的 /register 路由把新用户添加到数据库中后,会重定向到/index。在重定向之前,这个路由需要发送确认邮件。这个功能参考《Flask Web开发》这本书就可以了,我是拿QQ邮箱作为发送端的,所以我就只讲一下QQ邮箱配置需要注意的地方,在config.py文件中的配置如下。

import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    ...
    FLASKY_MAIL_SUBJECT_PREFIX = '[DXFORUM]'
    FLASKY_MAIL_SENDER = 'DXFORUM Admin <XXXXXXX@qq.com>'
    FLASKY_ADMIN = os.environ.get('DXFORUM_ADMIN')
    MAIL_SERVER = 'smtp.qq.com'
    MAIL_PORT = 465
    MAIL_USE_SSL = True
    MAIL_USERNAME = 'XXXXXXX@qq.com'
    MAIL_PASSWORD = 'XXXXXXXXXXX'
    DEBUG = True

    @staticmethod
    def init_app(app):
        pass

config ={ 'default': Config }

端口号465,MAIL_USERNAME是你的QQ邮箱地址,MAIL_PASSWORD是你QQ邮箱SMTP服务生成的授权码,获取步骤如下:
进入邮箱,点击设置,选择账户

72412B61-2199-4EE1-B2E4-3B49381E92CC.png

一直往下拉,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务一栏

416E0646-26D8-4F37-9C7A-A88303096AB2.png

只有开启了你的SMTP服务才能成功发送邮件,我这边是已经开启了,然后点击生成授权码,把生成的授权码复制填入MAIL_PASSWORD中即可。当然,MAIL_USERNAMEMAIL_PASSWORD这两个应该在环境配置中配置才更加稳妥,这里只是作为说明写在config.py中。

完成之后运行网站就可以去测试一下自己的注册功能是否成功实现,这里我还踩到一个坑,需要讲清楚。我在用确认邮件来确认注册账户的时候,flash消息提示已经成功验证您的账户,但是数据库中confirmed的值仍然为0,也就是说还是处于未验证状态。后来整了好久发现这个数据根本就没有被提交,应当在User模型中的confirm方法中添加db.session.commit()方法。

但是书中并没有写,这是因为它在配置文件中配置时写了SQLALCHEMY_COMMIT_ON_TEARDOWN = True这个配置键,这个配置键的作用我在第二章写过,是用于每次request自动提交db.session.commit(),而且我还写了这个配置键在最新版的Flask-SQLAlchemy中这个配置键已经被移除了,无需配置。Flask-SQLAlchemy 的 Changelog 文档里可以看出确实被移除了。

1DE0247F-153D-4AFB-9088-8997BA5D25CB.png

在查看完我的Flask-SQLAlchemy版本确认是最新版的之后,现在我只能说,它只是从文档中移除了,而没有从代码中移除,所以还是可以配置使用的。为了方便起见,我还是选择配置了,当然也可以自己去多加一个db.session.commit()方法,这无关紧要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,156评论 22 257
  • 前言 最近在看Flask Web开发,感觉这本书写的真不错,里面教开发者如何一步步开发一个博客系统。刚开始看的时候...
    happyte阅读 6,899评论 3 14
  • 第二部分 Blog例子 第八章 用户验证 大部分程序需要追踪用户身份。当用户连接到程序,通过一系列步骤使自己的身份...
    易木成华阅读 1,275评论 0 4
  • 大多数程序都需要进行用户跟踪。用户链接程序时需要进行身份认证,通过这一过程,让程序知道自己的身份。程序知道用户是谁...
    藕丝空间阅读 956评论 0 0
  • Flask笔记 2.1初始化 Web 服务器使用一种名为 Web 服务器网关接口(Web Server Gatew...
    WooiiiWooiii阅读 1,090评论 0 6