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 urlopen()函数 示例分享
Jun 12 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
基于python内置函数与匿名函数详解
Jan 09 Python
python购物车程序简单代码
Apr 18 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python3.5多进程原理与用法实例分析
Apr 05 Python
简单了解python反射机制的一些知识
Jul 13 Python
使用python绘制二维图形示例
Nov 22 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
Python 绘图和可视化详细介绍
2017/02/11 Python
Python开发的HTTP库requests详解
2017/08/29 Python
django加载本地html的方法
2018/05/27 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
40岁生日感言
2014/02/15 职场文书
总经理任命书
2014/03/29 职场文书
学生期末评语大全
2014/04/30 职场文书
积极向上的团队口号
2014/06/06 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书