likes
comments
collection
share

终于!我写出了自己的后端框架!

作者站长头像
站长
· 阅读数 6

前言

一路走来,真的是跌跌撞撞,从什么是html, 到什么是框架,这些东西又是怎么实现的,一切都是一个谜,让人着迷,让人抓狂!现在,我终于写出了自己心心念念的第一个框架!

转战各个框架

我自己喜欢专研各种技术,比如js技术栈,vue,uniapp,又到nodejs; 学了Nodejs后,听说这玩意找不到工作,然后转战java, 学了基础,又去学后端开发,学springboot; 可恶! 这玩意完全看不懂,各种注解,完全搞不懂,什么dao, 什么springcloud,完全搞不清楚! 后来是go。在b站看到有人说go语言好,哪里好呢?云原生,速度快,容易上手。 确实,学了基础后,就去琢磨后端框架,gin框架,学了一段时间后,发现,额,太简单了,不是企业级开发哪种,学了真的能找个工作吗?(虽然我还在读)后来又了解到goframe, 这个好,企业级开发框架,文档完善,表单、文件处理比gin好用,生态也好!就他了!了一段时间后,感觉就有点腻了,成也go, 败也go, 感觉各种语法确实简洁,但是没有nodejs的那种灵活性,一时间又有些后悔;于是转战express, koa, 。。。最后发现也就能自己开发小玩具使用,放弃了。 后来说Python,简单使用过flask, 感觉上手很容易,确实简单易用啊!但是奈何,受限于语言本身,运行太慢了!弃坑! 后来听说flutter开发挺好,学了dart, 随便看了看dart的生态,惨不忍睹,就我所知,大概只有2-3个框架,其中有一个叫frog,我自己看了看,完全不是我的菜!不过dart语法我是真的喜欢,仅次于nodejs! 最后是kotlin, kotlin更香!语法比Nodejs还灵活,简直爱死了!一看框架,springboot之类的,我就知道不是我的菜,诶。 兜兜转转,我都不知道我在干嘛!我的真爱在哪里! 学了那么多框架,我干脆想,干嘛不自己写一个? 说干就干!

语言选择

一开始我想的是kotlin,毕竟这门语言真的深得我心,其次是nodejs, 还有人生苦短的python. 一开始用kotlin写的时候,用的是AS, 谁知道写的时候,出现好多bugs,怎么也改不了,md,直接弃坑! 因为最近自己在使用python复现一门深度学习框架DeZero, 对python的了解又加深了,感觉确实不错,尤其是各种魔法函数,还有新增的类型系统,完美! 开干!

为什么不是nodejs?

我一开始也是想使用nodejs搞的,但是回头一想,nodejs的http库太完善了,基本可以直接使用了,这样的话不利于自己真正实现一个完整的框架!

开干

话不多说,先看效果!

终于!我写出了自己的后端框架!

该框架使用http.server模块作为基础,从而可以获取 这个简单的框架由下列部分构成:

  • 路由系统
  • 静态资源处理 (os )
  • Form表单处理 (cgi / urlparse)
  • Response (暂时包括json / 文本 / 文件)
  • URL解析
  • 自定义Handler

路由系统

路由系统并不完善,目前支持绝对匹配,换句话说,就是(path=="/index"这种),真的low...

终于!我写出了自己的后端框架! 可以看出来,自定义的handler需要继承BaseHTTPRequestHandler, 当有请求来的时候,他会自动区分是get请求还是post请求,如果是get,会直接调用do_GET方法,post则调用do_POST; 这里是路由机制的基础; 在这里的话,以get为例子: 我们对请求进行分析,如果包含 ".", 任务是资源请求,转到staticFile; 否则就默认为接口请求。 在接口请求里面,使用一个dict包裹路径和处理的handler类,然后将path传入dict里面,获取处理类,然后调用类的get方法,下面是一个handler例子:

终于!我写出了自己的后端框架!

其中ctx是原来baseHTTPRequestServer的请求,这里包装了一下; 路由系统的话,还可以扩展类似星号的这种模糊匹配,以及自动获取参数,但是目前还没有头绪。

静态资源处理

静态资源处理模块,主要是分析url,得出请求资源所在路径,然后使用os模块读取,再用response模块返回即可; 然后,特别地,需要根据请求的文件类型写不同的响应header,比如pdf文件就返回: application/pdf; txt文件返回text/plain

终于!我写出了自己的后端框架!

Form表单处理

form表单处理包括get请求参数和post的参数、文件出来; 我一开始是使用urlparse解析url,但是还是很反锁,代码如下:

终于!我写出了自己的后端框架! post处理的话我一开始没思路,就问gpt, 没想到真解决了大问题。 gpt提供了cgi这个模块,可以解析文件和参数,真的非常方便! form类目前支持 getFormValue / getFormValues / postFormValues / parseFiles / saveUploadFile / randomFileName这些方法

终于!我写出了自己的后端框架! 不仅如此,cgi还可以解析get, 那么上面的代码还有再改善一下!

response类

response应该是最简单的,就是设置各种header而已,比如返回json,就使用 application/json,其他就是状态码什么的,200就ok了; 目前支持 text / json / file 三种类型数据的返回

终于!我写出了自己的后端框架!

自定义handler

自定义handler的话很简单,只需要定义get方法和post方法就行,参数就是ctx: BaseHTTPRequestServer, 然后就可以开始干活了。 终于!我写出了自己的后端框架!