Python的CGIHTTPServer交互实现详解


Posted in Python onFebruary 08, 2018

介绍

对于服务器后端开发者而言,有时候需要把自己的一些服务直接暴露给PM或者其他RD使用,这个时候需要搭建一套web服务可以和前端用户做简单交互,按照最常规的做法,一般是用Apache或者Nginx作为webserver后端使用cgi或者fcgi程序或者脚本进行处理,当然这种做法安全且正规。

但是我个人更喜欢一个更简单的做法:就是利用python自带的CGIHTTPServer作为服务器,然后通过一个简单的html页面进行交互,通过post请求直接调用总控脚本,与用户进行交互。

Python的CGIHTTPServer交互实现详解

使用方法和示例

启动服务

Python的CGIHTTPServer一般是与python一起安装的,使用如下命令既可以启动,为了便于组织目录,建议先建立一个目录,比如web,然后再运行下面的命令。

nohup python -m CGIHTTPServer 8088 &

上面的命令使CGIHTTPServer在非中断后台运行,运行log可以通过当前目录下的nohup.out查看。

编写交互页面

在启动server的当前目录下,建立一个index.html文件,编写内容如下。

<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=gbk">
  <title> Python-CGIHTTPServer使用示例 </title>
  <meta name="author" content="Haiyu">
  <center><h1> Python-CGIHTTPServer使用示例 </h1></center>
 </head>
 <hr style="height:5px;border:none;border-top:5px ridge green;" />
 <body>
  <br/>
  <center><h2>计算圆的周长</h2></center>
  <center>
  <p>请输入圆的半径长度.</p>
  <br/>
  <form action="cgi-bin/c_length.sh" method="post" enctype="text/plain" target="_blank">
   radius:<input type="text" id="radius" name="radius" value=""/>
   <input type="submit" id="c_length" name="c_length" value="计算周长">
  </form>
  </center>
  <br/>
  <br/>
  <br/>
 </body>
 <hr style="height:5px;border:none;border-top:5px ridge green;" />
 <br/>
 <br/>
</html>

这个界面的功能非常简单,使用一个form表单接收用户的提交的半径参数,然后计算完周长之后进行返回,使用post请求。

CGI脚本

这个才是我们后端开发同学最关心的内容,这个脚本就是用来完成主要的逻辑操作进行返回,因为我们后端同学关注更多的不是交互界面的华丽而是逻辑处理的正确性和严谨性,根据我的经验,后端不管多么复杂的处理流程,最终都可以用一个脚本包起来,根据输入得到输出,这里面的输入就是我们用户提交的参数,输出就是我们经过层层处理之后需要返回的内容。
这个脚本建议放在server运行目录下新建立的cgi-bin目录中。

#!/bin/bash

mysql_bin=/home/work/mysql/bin/mysql

echo "Content-Type:text/html; Charset=gbk"
echo ""

echo "<br/>"
radius=0
c_length=0
if [[ "$REQUEST_METHOD" == "POST" ]];then
 read vars
 echo "$vars" | awk -F "=" '{print $2}' > temp
 dos2unix temp
 radius=`cat temp`
 c_length=$(echo "scale=2;2*3.14*$radius" | bc)

 echo "<br/>"
 echo "<table border="5" cellpadding="10">"
 echo "Userid Info:"
 echo "<tr>"
 echo "<td>半径</td><td>周长</td>"
 echo "</tr>"
 echo "<tr>"
 echo "<td>"$radius"</td><td>"$c_length"</td>"
 echo "</tr>"
 echo "</table>"
fi

总结

以上就是使用Python的CGIHTTPServer进行用户交互的主要内容,其优点就是开发使用方便,让后端同学能更加专注于业务逻辑处理相关的内容。不足之处可能就是不够正规,使用有风险,因为使用的是纯CGI协议交互,记得之前排查过一个bash的cgi漏洞,使用起来可能会有风险,因此这种方式更适合开发一套对内使用的简易工具,不建议对外部用户暴露。

Python 相关文章推荐
python引用DLL文件的方法
May 11 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
PHP实现发送和接收JSON请求
Jun 07 Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 Python
django的ORM操作 增加和查询
Jul 26 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
keras 读取多标签图像数据方式
Jun 12 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 Python
Python列表的索引与切片
Apr 07 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 #Python
python实现二叉查找树实例代码
Feb 08 #Python
单链表反转python实现代码示例
Feb 08 #Python
Python测试人员需要掌握的知识
Feb 08 #Python
python实现单向链表详解
Feb 08 #Python
Python生成器以及应用实例解析
Feb 08 #Python
代码分析Python地图坐标转换
Feb 08 #Python
You might like
php下intval()和(int)转换使用与区别
2008/07/18 PHP
php检测url是否存在的方法
2015/04/14 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
Javascript实现单例模式
2016/01/24 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
python实现石头剪刀布小游戏
2021/01/20 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
总经理年会致辞
2015/07/29 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL