https://cdn.programmer.work/icon/avatar.jpg

Shawn's blog

分享我的知识、经验、生活与感悟

文章内容可能过时、有瑕疵、有误、甚至和主流价值观相违背

在 Linux 中使用网桥 bridge

0X00 什么是网桥

普通的桥就是连接本来不通的路的基础设施,网桥就是用来本来不通的网的设备。但是这里介绍的不是真正意义上的物理设备,而是在 Linux 上创建的虚拟设备。Linux 上不仅可以创建虚拟网卡,也可以创建虚拟网桥,所以说我们在 Linux 环境下学习网络知识确实是一个不错的选择(除非你有钱买一堆物理设备🤣)。

2020 年终总结

0X00 前言

一年前的这个时候还在想,2020 年这个年号听起来很科幻,然而 “科幻” 这个词还是还是太瞧不起 2020 了,这一年简直是“魔幻”。

最近这几年来,过得最不舒服的应该要数今年的前两个月了,疫情刚刚爆发,武汉封城,人也不出门,就在家里当咸鱼。本来就焦虑的人们每天看到的新闻也只能让大家更加焦虑,每天看到的都是 “口罩、防护服没有了”,“武汉封城”,“急寻密切接触者”….

防范 CSRF

0X00 前言

https://blog-1251664340.cos.ap-chengdu.myqcloud.com/csrf.png

假设有这么一个银行(肯定要假设,如果真有这么蠢的话这银行也早就倒闭了)的网上银行站点,他提供了一套的 API,通过GET https://api.xxbank.com/transfer?amount=3000&to=shawn可以向 shawn 转账 3000 块。虽然用 GET 来修改数据是挺蠢的但是好像也没什么大问题是吧。

MySQL 查询执行内幕-基础篇

0X00 前言

这篇博文概述了一次查询从一条 SQL 到拿到数据的过程,是掌握了基础的 CRUD 后想要进阶 MySQL 的一条必经路(当然我是说这个只知识是必经路,并不是我这篇文章)。如果有兴趣的话就继续看下去吧~

使用 ab 和 http_load 进行简单的性能测试

0X00 概述

我们经常想要简单测试一下某个页面的性能,或者 REST API 的性能,用 postman 这种程序虽然可以很快的模拟请求出来但是并不方便发送大量请求;自己写脚本虽然自定义程度很高,但是写起来总归还是有点麻烦,而且并不能很方便得输出我们需要的一些常用数据。那这种时候一般就需要找些专业的工具来做这种专业的事情了。下面两个就是平时比较常用的性能测试工具,可以针对某个/某些 url 做性能测试,并且输出相对完整的报告。

SSO 和 LDAP

0X00 前言

上周在新公司接到的一个任务"给 XXX 系统集成 LDAP 登录"。我以前是没有了解过 LDAP 的,一听是集成登录功能,脑子里第一时间想到的就是之前做过的 SSO,但是经过一番搜索发现 LDAP 和 SSO 完全是两回事,而且发现还是不少人不了解其中的一项或两项技术,正好在这儿整理一下顺便分享给大家~

我的第一次跳槽之路

0X00 前言

都说“生活需要仪式感“,那对我来说的第一次跳槽还是值得记录的,用处肯定是没什么,但是总归是给自己一点点生活上的仪式感吧。而且脑子记住的东西可能过几年就忘记了,真正记录成文字的东西存活时间就会长久很多。(记录在网络上就算我自己把博客删了,都还会有垃圾站原封不动的抄走,简直不可能丢🤣)

MySQL 中的四种隔离等级

0X00 What’s this

我们知道 MySQL 中存在“事务”这么个事物(我是故意拗口的,哈哈哈哈哈哈哈);我们也知道事务“一荣俱荣,一损俱损”(要么事物内所有查询均生效,要么均不生效)。那么现在问题来了,银行数据库中有两个事务在同时进行,我们来看一下这两个事务

Python 上下文管理器

0X00 使用 with as 语法

我们写程序经常会操作文件,我们都知道写文件要 open/write/close ,尤其是 close ,没有的话文件就会出问题(有些内容在缓存里,没写入磁盘)。不过我们现在写文件应该没什么人这样写了,都是用with open('filename', 'w') as f的方式来操作文件了。如果说这样做的好处,那多数人都会说“不用手动关闭文件了”,错肯定没错的。

Django 中的 objects

0X00 objects 是个啥

想必所有用过 Django 的人都会用到 Django 自带的 ORM 进行数据库查询。那既然用过 Django 的 ORM 就来看一下这段代码好了, models.Stuent.objects.filter(name='Shawn') 这段代码是什么意思呢?很简单,就是查询到名字为"Shawn"的学生信息。具体来说, models 应该是一个放了多个 model 的文件,Student 是一个具体的模型,filter 是筛选,name='Shawn' 则是筛选条件。那么问题来了,中间那个 objects 是个啥呢?(你知道?知道还在这儿看啥,有这空看看其他文章,打打游戏看看电影不好吗🤣)

记一次 Django save 导致的数据异常

0X00 按惯例得有一个标题

众所周知save是 Django 中最常用的保存数据的方法。但是一般来说大家经常会把“常用“理解成“万能“,然后能用的时候就全用这一种方式。不过编程 中是没有所谓的“一招鲜吃遍天“的,Django 之所以提供了那么多中保存数据的方法也侧面证实了这一点。

如何在 Django 与 DRF 中优雅地校验权限

0X00 Django 中的权限结构、定义

我们知道在创建了一个 Django 项目之后,默认就有两个公开可用的 model:User 和 Group,这两个 model 的一项功能就是用来做权限管理的。系统中会有很多项权限,单个 user 可以配置拥有哪些权限,也可以将权限配置给 group。然后校验单个权限的时候其实就是将 user 本身的权限,和 user 所在的所有组的权限做一个并集,看本次操作的权限是否在这个并集里。在,那就校验通过;不在,那就只有 HTTP 403 了。

SSO 与 CAS

0X00 网站怎么登陆

回忆一下你用过的网站们,一般都是怎么登陆的? “就输入用户名密码登陆呗,要么就扫码登录,要么手机验证码登录,还能有啥”。确实没啥,咱们平时用到的登录方式也就都是这样的,而且这些其实从原理上来说都是 证明你是你 的手段,用户名密码是通过“密码只有你自己知道”为前提的,扫码和验证码是以“手机一定在你自己手上,并且只有你自己能解锁”为前提的。所以其实用户名密码并不是登录的唯一方法,理论上能证明你是你的一切方法都可以用来做授权认证,所以我们可以看到除了密码,出现了扫码、短信邮箱验证码、指纹、人脸、声纹、虹膜巴拉巴拉的。

为什么 Django 需要uWSGI

0X00 运行一个 Django 程序

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

Django 相对优雅地导出 CSV

0X00 前言

一见程序员,立刻想到 web 开发,立刻想到后台管理系统,立刻想到数据展示,立刻想到数据筛选筛选,立刻想到数据统计,立刻想到导出 Excel 表格。产品经理的想象惟在这一层能够如此跃进。 –鲁迅:我不是,我没有,别瞎说

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

0X00 前言

啊,这个破系统怎么这么慢。 -你写的程序的用户

是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。

Python 中的 filter 与 map/reduce 方法

0X00 前言 & Pythonic

Python管filter/map/reduce这些叫高阶函数,听起来有点高级有点难搞的意思,实际上是贼简单的东西。下面通过几个简单的例子来帮助大家了解一下filter/map/reduce这三个高阶函数的简单用法。

自控&目标

0X00 GTD

尽管去做 (英语:Getting Things Done / GTD ),是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。

GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来。通过这样的方式,头脑可以不用塞满各种需要完成的事情,而集中精力在正在完成的事情。

如何让 Django API 再快一点

0X00 前言

啊,这个破系统怎么这么慢。 –你写的程序的用户

是的,我用Django写的程序经常会出现性能问题,有时候是逻辑问题、有时候是数据库问题、有时候又是机器问题。我就现在这儿总结一波我自己的经验好了(这里都是基于我自己的经验来的,可能会相对比较简单,没有太骚太复杂太高级的东西)。这儿默认大家都是用的Django + Django REST framework了,因为我自己是用的这套技术栈,而且这套技术栈也算是Django生态下前后端分离的最常见的了。

读书笔记?

0X00 为什么要记读书笔记

本来我也是一个从来不记读书笔记的人,总觉得张无忌师傅的那个"都忘了吗?忘了就去吧"的神奇教诲很有道理,我也是一直都是看书看多少算多少,记住的就记住了,忘了也就忘了。即使这次开始记笔记也不是因为我要把看过的内容都记住,这完全不可能。