Shawn's Blog

SSO 与 CAS

0X00 网站怎么登陆 回忆一下你用过的网站们,一般都是怎么登陆的? “就输入用户名密码登陆呗,要么就扫码登录,要么手机验证码登录,还能有啥”。确实没啥,咱们平时用到的登录方式也就都是这样的,而且这些其实从原理上来说都是 证明你是你 的手段,用户名密码是通过“密码只有你自己知道”为前提的,扫码和验证码是以“手机一定在你自己手上,并且只有你自己能解锁”为前提的。所以其实用户名密码并不是登录的唯一方法,理论上能证明你是你的一切方法都可以用来做授权认证,所以我们可以看到除了密码,出现了扫码、短信邮箱验证码、指纹、人脸、声纹、虹膜巴拉巴拉的。 上面这些都是稳定靠谱的登录方式,我们来想另一个问题,你们有一个网站选用了用户名密码的方式登录,你和用户开开心心登录。后来你上线了另一个网站,你觉得用户该怎么登陆这个新网站呢?“新网站就再注册一次呀!”好的,用户又注册了一次。随着你们公司业务逐渐壮大,上线了 100 个网站,那用户要注册一百次吗?万一自己常用的用户名被占用了呢,岂不是 100 个网站可能会用 100 套不同的用户名密码?那用户可能就要骂娘了呦。…

为什么 Django 需要uWSGI

0X00 运行一个 Django 程序 运行一个 Django 程序可太简单了,从创建项目到运行起来总共也不超过 5 行代码。项目运行起来了就可以打开我们的 vim 或者 IDE 之类的一顿 coding 了。作为最最最开始写 Django 的同学来说到这里也就了解的差不多了,因为大家都是自己写好代码本地测试一下就提 Pul Request 到上游仓库了,然后什么单元测试、数据库迁移、测试环境版本发布甚至可能包含 docker 镜像更新就全都交给 CI 来做了。自己就这么开开心心的写了一段时间的代码,一切都在朝着好的方向发展。突然有一天部门主管或者老大告诉你有一个新项目要你来开个头,先搭好脚手架然后发布上去,后面再来人一起做功能迭代。 然后你开开心心地django-admin startproject xxxx、开开心心地django-admin startapp xxxxx,一顿 coding 之后懵逼了,没有部署过测试环境,没有部署过生产环境,只知道 CI 给做了,却完全不知道做了什么。然后你跑去看 CI 脚本,去问其他同事同学,得到了一堆 Nginx 和 uWSGI…

Django 相对优雅地导出 CSV

0X00 前言 一见程序员,立刻想到 web 开发,立刻想到后台管理系统,立刻想到数据展示,立刻想到数据筛选筛选,立刻想到数据统计,立刻想到导出 Excel 表格。产品经理的想象惟在这一层能够如此跃进。 --鲁迅:我不是,我没有,别瞎说 虽然上面这种说法有点夸张了,不过确实很多很多很多人在工作中遇到过不止一次的需要在一个 web 系统里添加一个”数据导出”的功能,而且通常都是导出成 csv 这种文件。自然我也遇到了很多很多很多次,也写过那种最蠢的手拼逗号的 csv 导出,还看过别人效果更好代码量更少的版本。也就在此总结一下具体这个 csv 导出该怎么搞才好。 最蠢的方案可能就是我最早实习的时候写出来的那种手拼逗号的方案了,为了大家刚吃的早午晚饭着想,就不给大家看了,省得吐出来浪费粮食。真正用的比较多的是这么两种:一种是传统的拼接二维数组的方式来模拟表格,然后通过 Python 的 csv 库直接导出;另一种是使用 djcsv 来进行导出。下面来简单看一下嘞。 0X01 原始 csv 导出 其实简单的导出原始的方法就可以解决问题了,下面只列出重点代码。首先导入 csv…

如何让 Django API 再快一点 (2)

0X00 前言 啊,这个破系统怎么这么慢。 -你写的程序的用户 是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。 其中可能性比较多,我这里先挑几个我经常遇到的情况来说:不管自己的需求直接查询所有字段、完全不在意索引、疯狂使用in、循环创建/更新数据、不善于使用缓存。这几个问题其实都会对我们的API响应速度造成比较大的影响,下面我们来一个个介绍一下。 0X01 SELECT * 首先我们一定知道,从数据库里查询的数据越多那反应也就越慢。我这里拿一个只有500条数据的表来展示一下,这里可以看到两次的耗时虽然都很短(那可不嘛,就500条数据),但是比例上还是差了三倍还多,如果随着数据量变大和字段变多这个差距就会更加明显。但是我们可以看到在循环里只需要name这个字段,多余的是用不到的。 实际上这两个查询执行的是不同的两个SQL(当然了这是废话),那具体区别呢?可以看到一个是SELECT *…

Python 中的 filter 与 map/reduce 方法

0X00 前言 & Pythonic Python管filter/map/reduce这些叫高阶函数,听起来有点高级有点难搞的意思,实际上是贼简单的东西。下面通过几个简单的例子来帮助大家了解一下filter/map/reduce这三个高阶函数的简单用法。 事先声明,这三个函数都是扩展性质的东西,从来不用这三个函数也可以正常的编写程序,没有什么功能是没了这三个函数就写不出来的。只不过是这三个函数的出现能让之前很丑陋的代码变得精简易读了而已。 这三个函数非常适合搭配lambda来使用,编写非常Pythonic的代码,具体什么是Pythonic其实很难定义,其实就是把Python编程一个形容词了,比如你看到一个人“穿了运动鞋牛仔裤帽衫双肩包黑框眼镜电子表”就会说他“太程序员了”,大概就是这么个意思。总结来说呢就是 非常具有Python特色的Python代码 。比如下面这段代码明显就不Pythonic 而这种代码就是Pythonic的写法 尤其是结合了lambda之后,就能写出更Pythonic的代码了,例如 就可以直接用lambda改写成这个样子 0X01 filter…

自控&目标

0X00 GTD 尽管去做 (英语:Getting Things Done / GTD ),是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。 GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来。通过这样的方式,头脑可以不用塞满各种需要完成的事情,而集中精力在正在完成的事情。 ​ --维基百科 GTD说白了就是把自己要做的事项从脑子里拿出来,写到纸上或者记到什么鬼地方,我最喜欢的就是"滴答清单"了。 最早的时候我用的是Google日历,在学校里的时候这样用了一两年还不错。后来大四出来实习,那段时间工作哪儿哪儿都不顺利,也就没心情安排自己的生活和学习了,所以实习的那一年基本就是下班了就趴在床上玩手机,什么都没干成。不只是没学习,而是没玩游戏没看电影,实打实的什么都没干成。后面又重拾了GTD,把自己安排的明明白白的,对我来说效果还是立竿见影的。我安排自己不只是学习,也包括社交和娱乐,约好什么时间和谁在哪儿吃饭或者干嘛的;自己给自己规定什么时间玩游戏,给自己规定什么时间看电影。…

如何让 Django API 再快一点

0X00 前言 啊,这个破系统怎么这么慢。 --你写的程序的用户 是的,我用Django写的程序经常会出现性能问题,有时候是逻辑问题、有时候是数据库问题、有时候又是机器问题。我就现在这儿总结一波我自己的经验好了(这里都是基于我自己的经验来的,可能会相对比较简单,没有太骚太复杂太高级的东西)。这儿默认大家都是用的Django + Django REST framework了,因为我自己是用的这套技术栈,而且这套技术栈也算是Django生态下前后端分离的最常见的了。 0X01 问题出在哪儿呢 众所周知"想要解决问题,首先就要找到问题在哪儿"。那怎么判断问题在哪儿呢? 1. 首先登到服务器上看htop,有面有一个Load…

读书笔记?

0X00 为什么要记读书笔记 本来我也是一个从来不记读书笔记的人,总觉得张无忌师傅的那个"都忘了吗?忘了就去吧"的神奇教诲很有道理,我也是一直都是看书看多少算多少,记住的就记住了,忘了也就忘了。即使这次开始记笔记也不是因为我要把看过的内容都记住,这完全不可能。 那到底是什么原因让我开始记读书笔记了呢?"走神"。没错,就是走神。我看书的时候,尤其是自己没有那么大兴趣的书,我经常机械的读着书然后思路就飞到不知道哪里去了,可能是其他相关的知识、可能是海拉鲁大陆、可能是九界湖、也可能幻想着自己去悬崖边上的麦田里抓那些快要掉到悬崖下的小孩儿了。 所以为了让自己不再继续走神下去,我决定做点什么。最开始的时候是尝试把自己看到的一切内容都真正的"读"出来,读出声来,但是后来发现这种方式不太适合我,每次一本正经得把书里的内容一个字一个字念出来都觉得很奇怪,像是小学生在上语文课一样。放弃读出声来的操作之后就想到了记笔记,目前看起来这种方案还是不错的。 0X01 我平时怎么记…

Linux中诡异的权限(奇怪的权限增加了)

0X00 前言 Linux诡异的权限是怎么回事呢?Linux相信大家都很熟悉, 但是诡异的权限是怎么回事呢?下面就让小编带大家一起了解吧。 Linux诡异的权限,其实就是诡异的权限了。那么Linux为什么会诡异的权限,相信大家都很好奇是怎么回事。大家可能会感到很惊讶,Linux怎么会诡异的权限呢?但事实就是这样,小编也感到非常惊讶。 那么这就是关于Linux诡异的权限的事情了,大家有没有觉得很神奇呢? 看了今天的内容,大家有什么想法呢?欢迎在评论区告诉小编一起讨论哦。 说正事说正事儿。说起Linux权限大家肯定:"这我知道啊,不就是rwx吗,r是读、w是写、x是执行。就这?"当然不只是这个,不过我们还是要从最基础的开始说起来。 0X01 基础权限部分 首先最基础的权限就是 rwx 这种,三组权限针对:所 属用户、所属用户的组、其他用户,每组3位(对应 二进制位)。正因为对应二进制位所以rwx就是三个 二进制位均为1的7;r-x就是对应的101也就是5;r- 就是100也就是4 最基础的rwx权限就不多说了,说一个不是所有人都 知道的,看下面这张截图:这个叫做linux.pdf的文…