Flask狼书笔记 | 08_个人博客(下)

2023-09-14 23:57:00

请添加图片描述

8 个人博客

8.4 初始化博客

1、安全存储密码

密码不要以明文的形式直接存储在数据库中,以防被攻击者盗取、泄露。一般的做法是,不存储密码本身,而存储通过密码生成的散列值。(但密码仍然可能在传输过程中被截获)

from werkzeug.security import generate_password_hash, check_password_hash
password_hash = generate_password_hash('cat')
is_right = check_password_hash(password_hash, 'cat')

疑惑:加盐散列值、密码扩展,是什么样的作用原理?

2、创建管理员用户

可以提供一个博客初始化命令,以免手动在数据库中,使用sql语句添加管理员用户记录。

@app.cli.command()
@click.option('--username', prompt=True, help='The username used to login.')
@click.option('--password', prompt=True, hide_input=True,
             confirmation_prompt=True, help='The password used to login.')
def init(username, password):
    # 创建管理员记录相关的操作
    ...

prompt参数设置为True会在用户没有输入参数值时,请求用户输入。hide_input用于隐藏输入内容,confirmation_prompt用于要求二次输入确认。

8.5 使用Flask-Login管理用户认证

博客程序需要根据用户的身份开放不同的功能,扩展Flask-Login提供了用户会话管理功能,管理用户的登入、登出,以及视图保护(如要求某些视图登录后才能访问)功能。(p275)

不过,这些功能即使自己利用session对象手动实现,也比较简单。

8.6 CSRFProtect实现CSRF保护

关于对资源的更新和删除操作,为了防止csrf攻击,应当使用POST方法提交这类请求,即使用表单提交。但为每个这样的操作都需要单独定义一个WTForms表单类,显然太过麻烦。Flask-WTF内置的CSRFProtect扩展为这类操作提供了更简单的方式。

使用该csrf保护,首先需要初始化扩展,并注册到程序实例。

from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect()
csrf.init_app(app)

然后直接在表单中创建一个csrf的隐藏字段。

<form method="post" action="{{ url_for('delete_post', post_id=post.id) }}">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
    ...
</form>

并且你可以注册一个错误处理函数,捕捉程序中产生的csrf错误,并产生对应的响应。

from flask_wtf.csrf import CSRFError

@app.errorhandler(CSRFError)
def handle_csrf_error(e):
    return render_template('errors/400.html', description=e.description), 400

8.7 编写博客后台

1、文章管理——删除确认弹窗

在后台管理中可以查看文章列表,并删除其中的文章,删除通常是不可恢复的。因此,为了防止误触,我们需要添加一个删除确认弹窗,使用浏览器内置的confirm弹窗组件即可实现。

<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Are you sure?');">
    删除
</button>

这一小结的其它内容都是一些比较简单的、面向业务逻辑的考虑,就不继续介绍了

Flask-Admin扩展:可以简化你编写管理后台的工作。(p297)

小结

这个项目,书中足足用了80页来介绍,涉及的内容确实比较丰富。我在看的时候有些赶进度,走马观花,快速带过。大部分的知识点都没有经过我的实践去体会,又只能把这个任务留给以后去完成了啊!

更多推荐

java面试题-并发编程相关面试题

java面试题-并发编程相关面试题1线程的基础知识面试官:聊一下并行和并发有什么区别?候选人:是这样的~~现在都是多核CPU,在多核CPU下并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程面试官:说一下线程和进程的区别?候选人:嗯,好~进程

<Altium Designer> 将.DSN文件导入并转换成SchDoc文件

目录01使用向导方式导入.DSN02消除UniqueIdentifiersErrors03文章总结大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师。本文主要是总结和分享将OrCADCapture画的原理图文件(.DSN)导入到AltiumDesigner,转换成对应的原理图文件(SchDoc)的方法。本文所使用

MySQL正则表达式:模式匹配、中文匹配、替换、提取字符串

在MySQL中,使用REGEXP或RLIKE操作符进行正则表达式匹配,而使用NOTREGEXP或NOTRLIKE操作符进行不匹配。一些常用的MySQL正则表达式语法:匹配字符:.:匹配任意字符(除了换行符)。[]:匹配方括号中的任意字符。[^]:匹配不在方括号中的任意字符。匹配重复:*:匹配零个或多个前面的字符。+:匹

【C++从0到王者】第三十一站:map与set

文章目录一、关联式容器二、pair键值对三、set1.set的介绍2.set的部分接口以及应用3.count4.lower_bound和upper_bound5.equal_range6.multiset容器四、map1.map的介绍2.map的一些常见接口以及使用3.map的[]运算符重载4.使用map改进一些题5.

代理IP和Socks5代理:跨界电商与爬虫的智能引擎

跨界电商,作为全球市场的一部分,对数据的需求越来越大。同时,随着互联网的发展,爬虫技术也在不断演进,成为了跨界电商的关键工具之一。然而,随之而来的是网站的反爬虫机制和网络安全风险。在这种情况下,代理IP和Socks5代理应运而生,为企业提供了数据采集的解决方案和网络安全的保护。本文将深入研究代理IP和Socks5代理在

应用平台 - OPPO敏感权限

那天在OPPO平台更新app时,发现平台权限升级,新增了敏感权限校验,而且还是必填项…Google从Android6.0开始就对权限做了分类适配,粗浅来看将权限分为了普通权限、危险权限(运行时权限、敏感权限),如果需要用到危险权限除了需要在AndroidManifest(清单文件)注册之外,我们还需要进行申请动态权限有

【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述基于遗传算法的最优配电变电站放置为了实现配电变电站

接口测试之文件上传

在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式传输给服务端,而服务端接受客户端传过来的二进制文件流以及文件名称等信息(此时这些二进制文件流存储在内存中),然后将其写入存储

物联网网络安全:保护物理世界和数字世界的融合

我们正在见证数字技术如何成为我们日常生活和经济系统的一部分,从而提高福利并增强竞争力。尽管如此,新的尖端互联技术的迅速出现和采用也对政府、企业和整个社会构成了重大威胁。长期以来,网络安全威胁一直是电影行业的一个现成的灵感来源,它设想了一些令人担忧的场景,在这些场景中,滥用技术和数据会危及社会、企业和政府。然而,被描绘成

角度回归——角度编码方式

文章目录1.为什么研究角度的编码方式?1.1角度本身具有周期性1.2深度学习的损失函数因为角度本身的周期性,在周期性的点上可能产生很大的Loss,造成训练不稳定1.3那么如何处理边界问题呢:(以θ的边界问题为例)1.3顺时针(CW)1.4逆时针(CCW)2角度回归的方式2.1长边定义法,强制W<H,range范围[-9

如何更好的选择服务器硬盘?

一.选择服务器硬盘时,可以考虑以下几个因素:1.容量需求:首先确定您的服务器对存储容量的需求。评估您预计需要存储的数据量、应用程序和文件的大小,以及未来的扩展需求。确保选择的硬盘能够满足服务器的存储需求,并有足够的空间用于备份和增长。2.性能要求:考虑您的服务器对性能的需求。如果服务器需要处理大量的读写操作、高速数据传

热文推荐