在我学习用户身份验证的时候,我发现这里有个小弊端,在用户注册完成后想要验证邮箱的时候,点击邮箱中的网址进行验证,此时还要登陆,这及其不符合我们的习惯。一般情况下我们只需要点击网址就可以验证成功并且进入到登录界面了。这是因为在确认路由中有login_required装饰器。

@auth.route('/confirm')
@login_required  //就是它
def resend_confirmation():
token = current_user.generate_confirmation_token()
send_email(current_user.email, 'Confirm Your Account',
'auth/email/confirm', user=current_user, token=token)
flash('A new confirmation email has been sent to you by email.')
return redirect(url_for('main.index'))

  所以我要把登录装饰器去了,在确认接口这里我改成需要传入两个参数,一个是token值,另一个就是用户唯一标识符,这里我选择用了id作为用户唯一标识符,来判断“是哪个人在验证他的身份”,当然如果你觉得 id 不安全的话也可以改成 username或者email,总之改完的代码变成这样

@auth.route('/confirm/<token>/<id>')
def confirm(token, id):
user = User.query.filter(User.id == id).first()
if user.confirmed:
return redirect(url_for('main.index'))
if user.confirm(token):
db.session.commit()
flash('恭喜您! {}!你已经确认了你的账户!请登录!'.format(user.username))
else:
flash('验证链接不正确或者超时')
return redirect(url_for('auth.login'))

  这里先把传过来的id接收,放到数据库里面进行比对,找到该用户(按理来说不存在找不到用户的情况,因为在注册后用户就被加入到数据库了,所以这里不必要写user不存在的情况)。先判断用户数是不是已经确认过了(conmfirmed为1),如果不是就验证token,这里的db.session.commit()提交的是confirmed的值,可以看一下User里面的confirm方法

    # 验证token
def confirm(self, token):
s = Serializer(current_app.config['SECRET_KEY'])
try:
data = s.loads(token.encode('utf-8'))
except:
return False
if data['confirm'] != self.id:
return False
self.confirmed = True
db.session.add(self)
return True

  再调用confirm方法后,如果token被验证成功,就会将user对象的confirmed设置为1(默认一直是0),然后在方法中add,在confirm函数中commit,这样我们就知道了是哪个人在验证。验证完成后重定向到登录界面。当然,在用户发送的邮件也需要改变,只要在url()后面多加上一个参数即可。这样用户就会重定向到我们的路由

<p>亲爱的 {{ user.username }},</p>
<p><b>欢迎来到我的博客!</b></p>
<p>为了确认您的信息 <a href="{{ url_for('auth.confirm', token=token,id=user.id, _external=True) }}">请点击这儿</a>.</p>
<p>当然,您也可以通过输入下面的网址进入</p>
<p>{{ url_for('auth.confirm', token=token,id=user.id, _external=True) }}</p>
<p>您亲爱的bolg主,</p>
<p>TXS</p>
<p><small>ps:不用回复</small></p>

  这样我们就完成了对验证方式的改进。

  

1.关于狗书《Flask Web开发 基于Python的web开发应用实战》身份验证的改进的更多相关文章

  1. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

  2. 关于狗书《Flask web开发 基于python的Web开发应用实战》中加入用户隐私功能

    目前是第二次撸狗书,在用户页面这一块我个人觉得有些问题(基于交互设计).按理来说,我作为一个权限只有User的个人用户来说,肯定不喜欢让别人看到我的真实姓名,地址之类的敏感信息.所以我应该是可以设置成 ...

  3. 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

    在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...

  4. Taffy Web开发,Python Flask实践详解

    1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能. 2. 实现细节 页面使用Python Flask +Bootstrap开发,还 ...

  5. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

  6. Taffy自动化测试框架Web开发,Python Flask实践详解

    1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能.   本页面适用所有基于taffy/nose框架编写的自动化测试脚本,或基于un ...

  7. 基于Python的WEB接口开发与自动化测试 pdf(内含书签)

    基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...

  8. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  9. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解

    原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...

随机推荐

  1. elasticsearch——Rest Client

    https://www.jianshu.com/p/66b91bec12e3 elasticsearch——Rest Client 0.2372018.05.10 15:23:03字数 1287阅读 ...

  2. JS中对象的定义及相关操作

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. 一、ASP.NET Iframework_SignalR集线器类(v2)

    一.新建项目,选MVC项目默认 添加mvc文件夹和核心引用 二.添加SignaIR包 SignalR的准备:NuGet包管理器搜索:工具——>库程序包管理器——>Microsoft.Asp ...

  4. 021-制作OpenStack镜像官方文档

    可参考官方文档:https://docs.openstack.org/image-guide/ 制作centos7 :https://docs.openstack.org/image-guide/ce ...

  5. vb中typename函数

    适用于获得一个变量的类型名称的, 比如 A 是一个字符串变量,那么 TypeName(A)=String

  6. jenkins插件send files or execute commands over ssh插件parameterized publishing选项使用

    1.设置一个参数 2.设置label 3.勾选parameterized publishing

  7. bzoj3091 城市旅行 LCT + 区间合并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...

  8. java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素

    Set类及子类: TreeSet有序子类: HashSet无序(散列)子类 HashSet子类的内容是没有顺序的,单个元素也不会重复的(对象除外). Set<String> allSet ...

  9. HTTP content-type及POST提交数据方式

    Content-Type(内容类型),一般指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式.什么编码读取这个文件,这也是一些网页点击的结果却是一个文件 ...

  10. 配置 app.js 文件

    pp.js 中存放全局的 JavaScript 逻辑. 示例: App({ onLaunch: function () { console.log('SWAN launch'); }, onShow: ...