Shawn's Blog
6 分钟阅读

使用 Flask 设计实现一套 REST API【成绩管理系统】

0X00 什么是REST风格的API 众所周知http协议有GET/PUT/POST/PATCH/DELETE等众多方法,还能在提交请求和发送响应的时候携带数据。REST风格的API就是使用了这些HTTP特性的API。针对一个URL可以有多种动词(方法)来表示不同的操作。 更多详细的内容可以点击查看阮一峰的博客:理解RESTful架构 0X01 怎么选用HTTP动词 常见的动词有这五种,可以对应自己的需求选用 | 动词 | 类似的SQL关键字 | 功能 | | |: :|: :| | GET | SELECT | 获取资源 | | POST | CREATE | 创建资源 | | PUT | UPDATE | 更新资源(需要提供改变后的完整资源) | | PATCH | UPDATE | 更新资源(需要提供改变的属性) | | DELETE | DELETE | 删除资源 | 0X02 设计URL REST风格的API因为可以用HTTP的动词,所以URL中是不带有动词的,如果我要获取某个学生的信息应该是[GET]…

1 分钟阅读

Python 中 OS 库的常用方法

在写一些系统脚本或者自动化运维脚本的时候经常会用到os库,这里做个整理,方便查找 os.sep 获得当前操作系统使用的目录分隔符,比如Windows就会得到\而Linux/Unix就会得到/ os.name 获得当前使用的操作系统,Windows是NT内核,所以会得到nt,而Linux/Unix用户则会得到posix os.getcwd() 获得当前工作目录,即当前Python脚本工作的目录路径。 os.getenv() 用来获得环境变量 os.getenv('PATH') os.environ 可以获取并修改环境变量 os.listdir() 列出某目录下所有的目录和文件 print(os.listdir()) os.remove() 删除文件 os.remove('D:/test.file') os.system() 运行Shell或者CMD命令 os.system('ifconfig') os.linesep 获取当前平台使用的行终止符。例如,Windows使用\r\n,Linux使用\n而Mac使用\r。 os.path.split()…

4 分钟阅读

浅析 HDFS

0X00 HDFS的设计 HDFS作为GFS的开源实现,和GFS是高度一致的。在HDFS中有着下面的优点 1. 对超大文件支持良好,由于其分布式实现,可以存储超大文件,甚至单个文件大小可以超过集群中任意一台机器的磁盘大小 2. 采用流式数据访问,一次写入、多次读取是最高效的访问模式。因为Hadoop作为一个大数据处理平台,并没有频繁的写入操作,只是在需要的时候一次将大量的数据写入然后在对这些数据进行读操作 3. Hadoop并不需要运行在昂贵且高可靠的硬件之上,单个节点可能性能可靠性都参差不齐,但是由于其高可靠性的设计,使之能在遇到节点故障时继续运行且不让用户察觉到明显的终端 但是HDFS也不是适用于各种场景,一下的几种场景就不适 1. 低时间延迟的数据访问,因为HDFS是以时间延迟为代价针对高数据吞吐量优化的,所以HDFS不适用与低延迟的数据访问 2. 大量的小文件,因为Namenode的设计是将文件系统的元数据存储在内存中的,所以理论上HDFS中的文件最大数量受限于Namenode的内存容量,因此大量的小文件会占用Namenode大量的内存 3.…

2 分钟阅读

Java 中的字符串

String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。 《Java编程思想》第13章 0X00 String常量池 如果使用常用的方式定义两个内容完全一样的字符串,那么Java使用常量的方式,也就是说第二个字符串并没有生成一个对象而是引用了之前的字符串,导致他们的本质是一样的,所以当使用==判断两个字符串对象是否是同一个对象的时候,会显示是同一个对象。但是如果我们每次声明一个字符串的时候使用new String()的方式,则会每次创建一个String对象,两者就不是同一个对象了。 0X01 StringBuilder 字符串的拼接在Java中非常方便,但常用的使用+来拼接字符串效率很低,在需要拼接的次数不是很多的时候不会影响多少效率,但当需要拼接的字符串数量很多的时候就需要使用StringBuilder来拼接。该类中有一个append()的方法,就是将一个字符串连接到本对象的字符串后面。下面我们来对比一下这两个拼接方法的速度差异。 执行结果如下 使用+连接耗时: 850…

3 分钟阅读

Python 奇技淫巧 (五) 系统脚本

文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 退出程序,显示错误信息 写脚本的时候经常会有执行出错,出错的时候可以用一句话把程序退出并且打印错误信息 raise SystemExit('error message') 0X01 输入密码 有的时候需要输入用户名和密码,使用input()输入用户名自然没有问题,但是用相同的方法输入密码的时候时使用明文的。长期用Linux的可能对Linux中密码的输入比较有印象,输入密码的时候是密文,且没有任何提示,包括星号,所以用这种方法输入密码是非常安全的。使用petpass库可以简单的输入用户名和密码,输入用户名最简单还是input(),如果要获取当前登录的用户名就可以使用getpass.getuser(),输入密码就可以使用getpass.getpass()来实现Linux中的那种密码输入。 如果测试的时候有问题可以在命令行下测试,比如Windows的CMD或者Linux的终端 0X03 执行命令…

3 分钟阅读

Python 奇技淫巧 (四) 文件&I/O

文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 指定编码 每个文本文件都是以某一编码格式保存的,如果解码格式和文本格式不同就会出现乱码,在Python中可以简单的控制用什么编码来打开文件以读写文件。使用open打开文件的时候指定一个encoding参数就可以使用其他而非默认编码打开文件了。这里用到了一个打开文件的方式是with open() as f:这样,这样做的话在这个with下面的代码块中可以直接调用f这个文件对象,并且执行到with代码块之外的时候会自动关闭文件,不需要再手动关闭文件。 0X01 输出重定向 在Linux中可以对命令的输出进行重定向,将本应该输出到屏幕的东西输出到指定的文件里,在Python中也是可以简单做到这一点的。假设一个已经用写入模式打开的文件对象f,在输出文字的时候就可以直接这样调用print('hello,world', file=f)就可以直接将输出的内容重定向到文件中。这里需要注意的就是文件必须已经用可写模式打开,且是文本模式。 0X02 指定分隔符和结尾…

2 分钟阅读

Python 奇技淫巧 (三) 函数

文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 任意个参数 Python中一般定义函数是这样的def add(a, b),参数的个数是固定的,那么怎么才可以接收任意多个参数就像rm 1.txt 2.jpg 3.mp3 4.cpp这样?很简单,使用`和就可以。下面代码里第一个参数a接收到了hello,world而b`则接收到了其余所有的参数,将其作为一个元组。 0X01 添加注解 在Python中定义函数的同时可以也给函数添加注解,注解可以帮助我们在调用函数的时候起到一个提醒的作用。虽然几十行的代码不会遇到看不懂的情况,但是在修改别人代码或者编写一个大项目的时候必然会有这种问题。我们可以直接在代码中加注释来解释说明,但是使用注解还是要比注释来得简单方便。不过通过注解注解指定的类型不像是C语言那样有实际意义,就算是你传入的参数和返回的值不是按照注解来的也不会报错。 0X02 默认参数…

4 分钟阅读

Python 奇技淫巧 (二) 字符串、文本

文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 split升级 字符串有一个split方法,可以用某个字符或字符串把源字符串切开。但是存在一个弊端,切割位置是固定的,不能灵活切割。有这样一个需求,将这个字符串hello 1 wrld 2 python 3 linux切割开,以每个数字为分隔符。这样标准的str.split就不能完成任务了。但是在re模块中有一个re.split可以完成这任务。这个方法的分隔符不是使用准确不变的字符/串而是使用正则表达式。 这里使用的正则表达式就是普通的字符串形式,而不需要re.compile进行编译。有了这个方法就可以更加灵活地切割字符串了。 0X01 字符串开头结尾的匹配 当我们有一堆的url,想在url中找到http开头且.jpg结尾的图片文件,以前我总是直接str.strip('http://') ==…

4 分钟阅读

Python 奇技淫巧 (一) 列表、集合、字典

文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 *表达式 从某个可迭代对象中分解出N个元素,但是这个可迭代的对象可能会超过N,会出现too many values to unpack异常。 比如我这儿有N个统计信息,因为第一次和最后一次的信息不准确需要删除掉,而将中间的信息保留下来,那么就可以这么弄。 这里的赋值就是将第一个和最后一个赋给了first和last,而中间的给了new_grade 0X01 定长队列 有一种情况:程序在运行的时候会记录日志,比如说web程序的访问历史。如果我们需要只保留最后的1W条数据,那么很快能想到使用一个列表,每次插入数据的时候判断长度,然后对应的append和del。但是有一个更简单且更快速的方法就是使用collections.deque()。下面的例子中有一个1024长的列表,我们列表里只存最新的7条。 运行之后可以看到,列表里只保存了最后插入的七条数据。 0X02 最大最小的几个元素 当我们有一个列表,需要找到列表里最大的N个元素时,一般会想到先排序然后分片,这想法当然不多,但是还有一个更好用的方法:…

2 分钟阅读

Python 的实例方法、静态方法、类方法

0X00 实例方法 Python中的实例方法是在面向对象编程中用到的最多的方法类型了。 实例方法 从字面理解就可以,就是说这个方法是属于实例的。每次实例化一个对象出来,这个对象都会拥有这个方法。从下面代码中就可以看得出来,这里我定义了一个实例方法'get_name()',定义实例方法不需要任何特殊的修饰符。 从运行结果可以看出来,针对每一个实例,调用实例方法的输出是不同的,也就可以证明这个方法是属于某个实例的。 小明 小红 0X01 静态方法 静态方法用的也很多,比如我们写正则表达式的时候经常会用到表达式的编译,一般都是这么写的're.compile()'这里就是一个静态方法。可以看到我们在调用编译方法的时候是并没有实例化一个re对象的。所以可以知道 静态方法 就是不需要实例化对象即可调用的方法。下面有一个例子,例子中还是上面的Student类,但是定义了一个静态方法'say_hello()',因为这是一个静态方法,所以不需要实例化对象即可调用。正因为这些特点,在定义静态方法的时候没有一个默认的参数self。…