本教程詳細介紹在用戶注冊過程中如何去驗證他們的email地址。
工作流程上來講,在用戶注冊一個新賬戶后會寄送一個確認信。直到用戶按指示完成了郵件中的“驗證”,否則他們的賬戶會一直處于“未驗證”狀態。這是大多數網絡應用會采用的工作流程。
這當中很重要的一件事就是,未驗證的用戶有什么權限?或者說,對于你的應用,他們是有全部權限呢,還是被限制的權限呢,還是根本沒有權限?對于本教程中的應用,未驗證用戶會在登錄后進到一個頁面,會提醒他們只有驗證了賬戶才可以進入應用。
開始前說明一下,很多我們要增加的功能是Flask-用戶和Flask-安全的擴展部分――問題來了,為什么不直接用這兩個擴展呢?嗯,首先,這是個學習機會。同時,這倆擴展都有局限性,比如支持的數據庫。要是你想用RethinkDB怎么辦呢?
我們開始吧
Flask基本注冊
我們將會要開始一Flask樣例,這包括了用戶基本注冊。從這個github倉庫獲取代碼庫。一旦你創建和激活了virtualenv,運行下面的命令來快速開始:
$ pip install -r requirements.txt$ export APP_SETTINGS="project.config.DevelopmentConfig"$ python manage.py create_db$ python manage.py db init$ python manage.py db migrate$ python manage.py create_admin$ python manage.py runserver
在應用運行的狀態下,訪問http://localhost:5000/register頁面,注冊一個新用戶。注意,注冊之后應用會自動登陸,引導你進入主頁面。大概看一下,然后運行代碼――尤其是user這個藍圖(Blueprint是flask的一個概念)。
完成時停止服務器。
更新當前應用
模型
首先,我們來在我們project/models.py中的User模型里添加上confirmed字段:
class User(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String, unique=True, nullable=False) password = db.Column(db.String, nullable=False) registered_on = db.Column(db.DateTime, nullable=False) admin = db.Column(db.Boolean, nullable=False, default=False) confirmed = db.Column(db.Boolean, nullable=False, default=False) confirmed_on = db.Column(db.DateTime, nullable=True) def __init__(self, email, password, confirmed, paid=False, admin=False, confirmed_on=None): self.email = email self.password = bcrypt.generate_password_hash(password) self.registered_on = datetime.datetime.now() self.admin = admin self.confirmed = confirmed self.confirmed_on = confirmed_on
注意此區域是怎樣默認成“False”的。還要添加個confirmed_on字段,那是個datetime。為了用隊列分析來分析registered_on和confirmed_on日期的不同,所以我想包含這個datetime。
讓我們完全從頭開始創建數據庫并遷移吧!所以,先刪除數據庫dev.sqlite,以及“遷移”文件夾。
控制命令
接下來,在manage.py中,更新create_admin命令,使新的數據庫字段生效:
@manager.commanddef create_admin(): """Creates the admin user.""" db.session.add(User( email="ad@min.com", password="admin", admin=True, confirmed=True, confirmed_on=datetime.datetime.now()) ) db.session.commit()
要確保導入datetime。現在,先再一次運行下面的指令:
$ python manage.py create_db$ python manage.py db init$ python manage.py db migrate$ python manage.py create_admin
register()視圖函數
最后,在我們再次注冊用戶之前,我們需要改一下project/user/views.py中的register()視圖函數……
user = User( email=form.email.data, password=form.password.data)
改成下面的:
user = User( email=form.email.data, password=form.password.data, confirmed=False)
明白了嗎?思考下為什么要把confirmed默認成False。
嗯好。再運行一遍應用。轉入到http://localhost:5000/register,再注冊一個新用戶。如果你在SQLite瀏覽器中打開了你的SQLite數據庫,你會看到:

那么,這個我新注冊的用戶,michael@realpython.com沒有被驗證。讓我們驗證它。
添加email驗證
產生驗證令牌
郵件驗證應包含一個特殊URL,使得用戶只需簡單地點擊它,即可驗證他/她的賬戶。理想情況下,這個URL應該看起來像這樣 主站蜘蛛池模板: 渑池县| 临安市| 兴化市| 宁河县| 大城县| 陆川县| 水富县| 乌恰县| 吉首市| 甘洛县| 杭锦旗| 嘉黎县| 岐山县| 家居| 桃江县| 福建省| 保康县| 莱芜市| 赫章县| 法库县| 安福县| 丰镇市| 桂林市| 隆回县| 大田县| 婺源县| 上思县| 澄迈县| 沅江市| 泗洪县| 呼伦贝尔市| 松桃| 吉隆县| 松溪县| 青河县| 鄂伦春自治旗| 康乐县| 衡南县| 昌邑市| 手机| 富宁县|