nochat1205 / cgi-server

multithreading cgi server using python3

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

多线程CGI服务器

教程

从PYPI安装

在线安装

pip install cgi-server

本地安装,从最新的release中下载.whl文件,下载完成后执行如下命令(注意版本命名,下面安装的版本是1.2.1)

pip install cgi_server-1.2.1-py3-none-any.whl

从源码安装

下载源码,可以从最新的release下载代码,也可以通过git下载

git clone git@github.com:0x404/cgi-server.git

下载完成后,进入文件根目录,执行安装命令

python setup.py install

安装成功后,即可作为一个普通的Python库使用

使用

下面的例子构建了一个如何利用本库快速创建一个hello world页面

# hello.py
from cgiserver import route, run

@route("/helloworld", method="GET")
def web_page():
    response = "<h1> Hello World </h1>"
    return response

if __name__ == "__main__":
    run("127.0.0.1", 8888)

执行如下命令:

python hello.py

即可在http://127.0.0.1:8888/helloworld看到一个hello world页面

更详细的使用说明请见example.py,里面详细介绍了本库的各种功能

除此之外,可以参考这个仓库,在这个仓库中使用本框架构建了一个网页应用程序,支持静态页面,Ajax请求等功能

卸载

使用如下命令完成卸载

pip uninstall cgi-server

目前功能

  • HTTP解析
  • HTTP服务器
  • 静态路由和CGI路由
  • 路由装饰器
  • 最大链接数量
  • 解析HTTP的报错处理
  • 错误代码400, 403, 404处理和用户自定义模板

TODO

  • 解析decorated function
  • 实现参数能够通过模板指定
  • 完善测试,目前的测试不够完善,尤其是对出错处理
  • 服务器处理请求可以说是一个IO形的行为,有很多时间消耗在(等待)输入/输出上;Python的全局解释锁导致这类程序多线程和单线程区别并不是很大,为了提高系统性能,我们是不是应该用多进程来替代多线程呢?
  • 实现decorated function返回模板
  • 欢迎重构

参与开发

  1. 环境配置

    • Python版本需要大于等于3.9,主要原因是当前代码里有一些typehint之前的版本并不支持

    • 目前并没有依赖任何第三方库,但依赖pylintblack来做代码风格检查和静态代码分析,以及pytest测试

    • 安装方法:

      pip3 install -r requirements.txt
  2. 提交代码

    • github的分支保护对私有仓库要收费,虽然大家都有main分支的push权限,但请不要直接push到main分支
    • 在完成自己的功能时请自己开一个分支,在自己的分支上完成代码的提交,待功能完成后提出合并请求
    • 已经添加github action来自动完成代码风格和静态代码检查,请确保提交前自己的commit是“打钩”的状态
    • 合并请求需要至少一个approval才可以合入master(大家都有权限)

设计思路

利用python的socket编程简单实现一个服务器,对socket发送过来的数据做HTTP协议的格式解析,获得一个Config,其中包含HTTP请求中的所有内容,如访问路径,访问方法等。

  • 对于静态请求很简单,根据访问路径返回一个HTML字符串即可
  • 对于动态请求也不难,对于python来说,一个python脚本就是一个cgi程序,所以把Config的路径绑定到对应的脚本路径上,运行脚本即可
    • 更具体一些,我们可以认为一个pythonCallable object就是一个cgi程序,从而我们可以直接绑定到一个类或者一个函数上
  • 关于多线程:我现在简单地开一个主线程用来监听端口,一旦有一个新的socket连接过来,开一个线程去跑一个session处理这个socket(由于HTTP协议一次请求一次回复,所以相对好做

About

multithreading cgi server using python3

License:MIT License


Languages

Language:Python 99.3%Language:Dockerfile 0.6%Language:Shell 0.2%