python 做网站用服务器_Python实现简单的Web服务器 Part2—支持动态网站
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—支持动态网站相关推荐
- python搭建web服务器_Python搭建简单的web服务器
Python搭建简单的web服务器 1.win+R输入cmd打开命令行 2.通过 cd 进入到你保存 HTML 文件的目录.例如:H:\D3\d3 输入 cd\ 指令进入到C盘的根目录.(CD(更改目 ...
- web服务器python_一个简单的web服务器(python)
今天用python写一个简单的web服务器代码网上都有只是为了方便大家学习做了一个简单的教程 第一首先我们来一张架构以及运行过程的流程图 本文学习仅供参考,需要更多资料可以加群:496257369 简 ...
- Python小项目四:实现简单的web服务器
本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www.shiyanlou.com/courses/552.不同之处在于实验楼使用python2.7,而博主这里使用的是p ...
- python实现一个简单的项目_Python小项目四:实现简单的web服务器
本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www.shiyanlou.com/courses/552.不同之处在于实验楼使用python2.7,而博主这里使用的是p ...
- 用Python建立最简单的web服务器
用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认 ...
- 用python写一个简单的web服务器
人生苦短,我用python 简洁高效,这才是理想的语言啊 分享一点python的学习经验-----如何用python写一个简单的web服务器 首先,我们需要简单地了解一下网络通信协议,这里用白话介绍一 ...
- python搭建web服务器_用Python建立最简单的web服务器
利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令:python -m Web服务器模块 [端口号,默认8000]例如:python -m Sim ...
- 开启简单的web服务器成为文件下载服务器
2019独角兽企业重金招聘Python工程师标准>>> 开启简单的web服务器成为文件下载服务器 1 进入需要共享的目录 2 运行命令 开启web服务 命令: python -m S ...
- 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 ...
最新文章
- 【MySQL】缩略语PK NN UQ BIN UN ZF AI G、基本操作语句
- Python编程神器Jupyter Notebook使用的28个秘诀(附代码)
- python 目录和文件操作
- 如何将h5网页改成微信网页
- 作为Java程序员,这些开源工具你应该要学习!
- 第三届蓝桥杯决赛真题---数量周期
- 201621123053《Java程序设计》第十四周学习笔记文章
- 根据进程名称获取进程id
- CNN提取文本特征,融合PMF模型实现推荐系统
- 的write方法有哪些参数_Python笔记13:文件操作三件套:read,write,seek
- HDU 4379 水题,大水,但我WA了很多次,做了很久
- 【动态规划 回文串13】LeetCode 647. Palindromic Substrings
- create session 参数介绍
- 复杂数组类型的深拷贝
- python清空屏幕代码_python代码怎样清屏
- 计算机软件毕业设计项目源码大全
- HTML&CSS:制作简易电商网站
- 曼孚科技:7种常用的数据标注工具
- 微服务整合J2cache并改造使用
- 扫码枪扫码之后导致页面跳转
热门文章
- 设备像素比devicePixelRatio简单介绍
- ehcache 手动刷新缓存_清空DNS缓存的两个小方法
- git stash后怎么恢复_苹果换卡后怎么恢复通讯录?两种方法帮你解决
- 无法装载这个对象_面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
- android toolbar 颜色渐变,android – 如何使渐变形状留在CollapsingToolbarLayout标题后面...
- model存储 swift_使用Swift原生JSON-Model
- 《如何建立自己的算法交易事业》读书笔记
- 关于软件测试工程师所应该具备的能力,就业前景还有适合女生从事吗?
- 计算机图形学是指使用计算机通过,【填空题】计算机图形学是指使用计算机通过()在显示设备上构造出图形来。...
- 2018/11/22工作日志