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

    淘宝核心系统团队 http://csrd.aliapp.com/ 淘宝搜索技术博客 http://www.searchtb.com 淘宝量子恒道官方博客 http://blog.linezing.co ...

  2. RK3288之kernel目录结构以及功能

    :~/RK3288/kernel$ ls android include MAINTAINERS security arch init Makefile sound backported-featur ...

  3. Python3找出List中最大_最小的N个数及索引

    # -*- coding: utf-8 -*- import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 24, 37, 2] # 最大的3个数的索引 max_ ...

  4. Netty学习--第一章 JDK自带的BIO

    一.什么是BIO BIO是传统的通信技术,在BIO通信模型中,客户端发送请求给服务器,服务器每次都是会单独创建一个线程来监控客户端的请求,会为每个客户端创建一个线程来处理请求.当前服务器处理完成后,通 ...

  5. mysql 分页查询及优化

    1.分页查询 select * from table limit startNum,pageSize 或者 select * from table limit pageSize offset star ...

  6. C++ GUI Qt4学习笔记03

    C++ GUI Qt4学习笔记03   qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...

  7. 【bzoj 4554】【Tjoi2016&Heoi2016】【NOIP2016模拟7.12】游戏

    题目 分析 当没有石头的时候,就用二分图匹配来做. 但现在加入了石头, 所以,求出每行和每列联通快的个数,如果有一块平地,包括在某个行联通块以及某个列联通块中,连边. //无聊打了网络流,匈牙利也可以 ...

  8. Java各种锁机制简述

    线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题. 在 Java 多线程编程当中,提供了多种实现 Java 线程安全的方式: 最简单的方式,使 ...

  9. python+requests接口自动化框架

    为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...

  10. linux运维、架构之路-MHA高可用方案

    一.软件介绍          MHA(master high   availability)目前是MySQL高可用方面是一个相对成熟的解决方案.在切换过程中,mha能做到0-30s内自动完成数据库的 ...