1. 什么是CGI?

CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。

下面是我个人对CGI的理解

就是最早的web服务器,只能处理静态页面的响应,比如 localhost/index.html 。但是有的时候,浏览器需要和服务器进行数据的交互,是一个动态的网页。

比如说,浏览器提交了账号和密码,提交给服务器,服务器收到数据之后,然后返回一个计算的结果。这就是动态的页面了。

比如,输入一个网页是 localhost/.index.php,localhost/index.jsp,localhost/index.py 。

比如说,写php的时候,服务器的目录下面可能会有这样的文件,文件名是 index.php

echo "Hello World!";

?>

当浏览器请求 localhost/index.php 这个文件的时候,其实服务器并不会立刻把这个文件返回给服务器,它会先在自己这边执行一下,然后把执行的结果返回给服务器。

这就是我理解的CGI。

下面想写得是,在这个简单的web服务器上去支持cgi。

比如说,当浏览器输入 localhost/time.py 的时候,返回的不是一个静态的固定的网页,而是能够返回当前的时间。这个就需要服务器能够支持对动态网页的响应。也就是说,服务器收到浏览器的请求之后,先在服务器端执行一下进程,然后在把执行的结果返回。

运行结果 是这样

image.png

http 命令 是一个好工具 !

增加了对脚本文件的处理

class case_cgi_file(object):

'''脚本文件处理'''

#判斷一下當前的服務器上有沒有這個文件

def test(self, requesthandler):

return os.path.isfile(requesthandler.full_path) and \

requesthandler.full_path.endswith('.py')

#如果有的話,就去執行

def act(self, requesthandler):

##运行脚本文件

self.run_cgi(requesthandler)

#去執行這個python腳本,執行之後將結果返回

def run_cgi(self,requesthandler):

data = subprocess.check_output(["python", requesthandler.full_path])

#將執行的結果返回個瀏覽器

requesthandler.send_content(data)

这是全部的代码:

#coding:utf-8

import sys,os,BaseHTTPServer

from datetime import datetime

import subprocess

class case_cgi_file(object):

'''脚本文件处理'''

#判斷一下當前的服務器上有沒有這個文件

def test(self, requesthandler):

return os.path.isfile(requesthandler.full_path) and \

requesthandler.full_path.endswith('.py')

#如果有的話,就去執行

def act(self, requesthandler):

##运行脚本文件

self.run_cgi(requesthandler)

#去執行這個python腳本,執行之後將結果返回

def run_cgi(self,requesthandler):

data = subprocess.check_output(["python", requesthandler.full_path])

#將執行的結果返回個瀏覽器

requesthandler.send_content(data)

#RequestHandler 繼承 BaseHTTPRequestHandler ,所以他自身就有一個path的數據成員

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

Error_Page="""\

Error accessing {path}

{msg}

"""

Cases=[case_cgi_file()]

#這裏的self其實是 RequestHandler對象

def do_GET(self):

try:

self.full_path = os.getcwd() + self.path

for case in self.Cases:

if case.test(self):

case.act(self)

break

except Exception as msg:

self.handle_error(msg)

def handle_error(self,msg):

content=self.Error_Page.format(path=self.path,msg=msg)

self.send_content(content,404)

def send_content(self,page,status=200):

#print 'send_content function '

self.send_response(status)

self.send_header('Content-Type','text/html')

self.send_header('Content-Length','text.html')

self.end_headers()

self.wfile.write(page)

if __name__ == '__main__':

serverAddress = ('', 8081)

server = BaseHTTPServer.HTTPServer(serverAddress, RequestHandler)

server.serve_forever()

关于python 创建一个子线程

去执行其他的可执行文件的用法。这个很像linux下的 exec()函数。如果感兴趣的话,可以去深入了解subprocess库。

import subprocess

path='./echo.py'

res=subprocess.check_output(["python",path])

print res

image.png

python 做网站用服务器_Python实现简单的Web服务器 Part2—支持动态网站相关推荐

  1. python搭建web服务器_Python搭建简单的web服务器

    Python搭建简单的web服务器 1.win+R输入cmd打开命令行 2.通过 cd 进入到你保存 HTML 文件的目录.例如:H:\D3\d3 输入 cd\ 指令进入到C盘的根目录.(CD(更改目 ...

  2. web服务器python_一个简单的web服务器(python)

    今天用python写一个简单的web服务器代码网上都有只是为了方便大家学习做了一个简单的教程 第一首先我们来一张架构以及运行过程的流程图 本文学习仅供参考,需要更多资料可以加群:496257369 简 ...

  3. Python小项目四:实现简单的web服务器

    本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www.shiyanlou.com/courses/552.不同之处在于实验楼使用python2.7,而博主这里使用的是p ...

  4. python实现一个简单的项目_Python小项目四:实现简单的web服务器

    本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www.shiyanlou.com/courses/552.不同之处在于实验楼使用python2.7,而博主这里使用的是p ...

  5. 用Python建立最简单的web服务器

    用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认 ...

  6. 用python写一个简单的web服务器

    人生苦短,我用python 简洁高效,这才是理想的语言啊 分享一点python的学习经验-----如何用python写一个简单的web服务器 首先,我们需要简单地了解一下网络通信协议,这里用白话介绍一 ...

  7. python搭建web服务器_用Python建立最简单的web服务器

    利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令:python -m Web服务器模块 [端口号,默认8000]例如:python -m Sim ...

  8. 开启简单的web服务器成为文件下载服务器

    2019独角兽企业重金招聘Python工程师标准>>> 开启简单的web服务器成为文件下载服务器 1 进入需要共享的目录 2 运行命令 开启web服务 命令: python -m S ...

  9. ipad php mysql_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

最新文章

  1. 【MySQL】缩略语PK NN UQ BIN UN ZF AI G、基本操作语句
  2. Python编程神器Jupyter Notebook使用的28个秘诀(附代码)
  3. python 目录和文件操作
  4. 如何将h5网页改成微信网页
  5. 作为Java程序员,这些开源工具你应该要学习!
  6. 第三届蓝桥杯决赛真题---数量周期
  7. 201621123053《Java程序设计》第十四周学习笔记文章
  8. 根据进程名称获取进程id
  9. CNN提取文本特征,融合PMF模型实现推荐系统
  10. 的write方法有哪些参数_Python笔记13:文件操作三件套:read,write,seek
  11. HDU 4379 水题,大水,但我WA了很多次,做了很久
  12. 【动态规划 回文串13】LeetCode 647. Palindromic Substrings
  13. create session 参数介绍
  14. 复杂数组类型的深拷贝
  15. python清空屏幕代码_python代码怎样清屏
  16. 计算机软件毕业设计项目源码大全
  17. HTML&CSS:制作简易电商网站
  18. 曼孚科技:7种常用的数据标注工具
  19. 微服务整合J2cache并改造使用
  20. 扫码枪扫码之后导致页面跳转

热门文章

  1. 设备像素比devicePixelRatio简单介绍
  2. ehcache 手动刷新缓存_清空DNS缓存的两个小方法
  3. git stash后怎么恢复_苹果换卡后怎么恢复通讯录?两种方法帮你解决
  4. 无法装载这个对象_面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
  5. android toolbar 颜色渐变,android – 如何使渐变形状留在CollapsingToolbarLayout标题后面...
  6. model存储 swift_使用Swift原生JSON-Model
  7. 《如何建立自己的算法交易事业》读书笔记
  8. 关于软件测试工程师所应该具备的能力,就业前景还有适合女生从事吗?
  9. 计算机图形学是指使用计算机通过,【填空题】计算机图形学是指使用计算机通过()在显示设备上构造出图形来。...
  10. 2018/11/22工作日志