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中xrange用法分析
Apr 15 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
django跳转页面传参的实现
Sep 17 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检测iis环境是否支持htaccess的方法
2014/02/18 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
php socket通信简单实现
2016/11/18 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
银行学习十八大感想
2014/01/11 职场文书
个人委托书格式
2014/04/04 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
司法所长先进事迹
2014/06/02 职场文书
运动会方阵口号
2014/06/07 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
常住证明范本
2015/06/23 职场文书
英文投诉信格式
2015/07/03 职场文书
我的收音机情缘
2022/04/05 无线电