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使用urllib模块开发的多线程豆瓣小站mp3下载器
Jan 16 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
python可视化爬虫界面之天气查询
Jul 03 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
pytorch梯度剪裁方式
Feb 04 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 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
建立文件交换功能的脚本(三)
2006/10/09 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
elgg 获取文件图标地址的方法
2010/03/20 PHP
PHPCMS的使用小结
2010/09/20 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
Vue实现按钮级权限方案
2019/11/21 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
Python中字符串的格式化方法小结
2016/05/03 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
使用python实现名片管理系统
2020/06/18 Python
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
文员个人求职自荐信
2013/09/21 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
企业文化演讲稿
2014/05/20 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
工伤调解协议书
2016/03/21 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS