1.关于狗书《Flask Web开发 基于Python的web开发应用实战》身份验证的改进
在我学习用户身份验证的时候,我发现这里有个小弊端,在用户注册完成后想要验证邮箱的时候,点击邮箱中的网址进行验证,此时还要登陆,这及其不符合我们的习惯。一般情况下我们只需要点击网址就可以验证成功并且进入到登录界面了。这是因为在确认路由中有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开发应用实战》身份验证的改进的更多相关文章
- 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉 ...
- 关于狗书《Flask web开发 基于python的Web开发应用实战》中加入用户隐私功能
目前是第二次撸狗书,在用户页面这一块我个人觉得有些问题(基于交互设计).按理来说,我作为一个权限只有User的个人用户来说,肯定不喜欢让别人看到我的真实姓名,地址之类的敏感信息.所以我应该是可以设置成 ...
- 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
- Taffy Web开发,Python Flask实践详解
1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能. 2. 实现细节 页面使用Python Flask +Bootstrap开发,还 ...
- 基于Python的Web应用开发实践总结
基于Python的Web应用开发学习总结 项目地址 本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...
- Taffy自动化测试框架Web开发,Python Flask实践详解
1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能. 本页面适用所有基于taffy/nose框架编写的自动化测试脚本,或基于un ...
- 基于Python的WEB接口开发与自动化测试 pdf(内含书签)
基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...
- Java Web开发和Python Web开发之间的区别
今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
随机推荐
- mpg123 - 播放 MPEG 1.0/2.0 Layer-1, -2, -3 音频文件
语法 mpg123 [ -tscvqy01m24 ][ -b size ][ -k num ][ -n num ][ -f factor ][ -r rate ][ -g gain ][ -a dev ...
- 四、绑定SignaIR的用户管理
一.用户分组(第一个默认我的好友,禁删和更改) 没有分组id,更改layim代码: 更改id即可. layui.define('jquery', function (exports) { " ...
- Navicat连接阿里云服务器MSQL数据库
新买了台服务器Navicat老是连接不上数据库,查找一圈找到解决办法.So Easy 一.shell远程登录,进入数据库 mysql -uroot -p 二.输入以下命令进行授权: GRANT ALL ...
- java 模拟表单方式提交上传文件
/** * 模拟form表单的形式 ,上传文件 以输出流的形式把文件写入到url中,然后用输入流来获取url的响应 * * @param url 请求地址 form表单url地址 * @param f ...
- Django【第27篇】:ModelForm
基于Form组件实现的增删改和基于ModelForm实现的增删改 一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=No ...
- Spring Boot 整合Spring Data JPA
Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...
- TinyMCE不可编辑
1. 通过配置在控件初始化时设置 tinyMCE.init({ readonly : 1 }); 2.tinymce.activeEditor.getBody().setAttribute('cont ...
- 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- mybatis config 快速生成xml DAO
0.加jar包 1.a.BAT java -jar E:\GZH\Mybaits\mybatis-generator-core-1.3.2\lib\mybatis-generator-core-1.3 ...
- B/S超大文件上传与下载
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...