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

    #检查语法 /application/nginx/sbin/nginx –t #平滑重启 /application/nginx/sbin/nginx –s reload #不间断服务重启,将 pid ...

  2. 统计学习方法——第四章朴素贝叶斯及c++实现

    1.名词解释 贝叶斯定理,自己看书,没啥说的,翻译成人话就是,条件A下的bi出现的概率等于A和bi一起出现的概率除以A出现的概率. 记忆方式就是变后验概率为先验概率,或者说,将条件与结果转换. 先验概 ...

  3. 真正解决iframe高度自适应问题

    1.前言 解决iframe高度自适应问题有两种方法1.pym2.手动设置iframe的高度 本文主要是总结第二种实现方式,因为第一种pym.js插件我没用懂 如果使用iframe时,遇到以下的需求: ...

  4. classloader加载class的流程及自定义ClassLoader

    java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...

  5. java基础拓展

    1. 作用域:public private protected 默认的区别 public:在同一项目中,被public修饰的在任何地方都可以被调用 private:被private修饰的,只能在本类中 ...

  6. TweenMax的GSAP(GreenSock动画平台)GSAP,专业的Web动画库

    很好奇红框框里面的内容是什么,于是点了进去,又百度了下这个英文缩写具体指的什么东西. GSAP的全名是GreenSock Animation Platform,是一个从flash时代一直发展到今天的专 ...

  7. React Native 中不用手点击,代码实现切换底部tabBar

    参考:https://www.jianshu.com/p/02c630ed7725 tabBar1页面有按钮,点击切换到tabBar2 直接用this.props.navigation.navigat ...

  8. 倍增O(1)求区间&值与|值

    ;i<=n;++i) f[i][]=a[i],g[i][]=a[i]; ;(<<j)<=n;++j) ;(i+(<<j)-)<=n;i++) { f[i][j ...

  9. 题解 P1433 【吃奶酪】

    这道题是一道著名的NP问题. 正解应该是DP,但我在这里讲一种近似算法--爬山. 希望某些dalao注意一下爬山与模拟退火的区别. 爬山是直往低处往高处爬,每次取大的,也就是一种贪心思想. 而模拟退火 ...

  10. nvm 管理 node 版本

    nvm 有 Mac 版本 num 亦有 windows 版本(可以搜索 nvm for windows) 安装后 运行 nvm v 可查看版本 运行 nvm install latest 安装最新版本 ...