Python 实现简单的 Web
简单的学了下Python, 然后用Python实现简单的Web。
因为正在学习计算机网络,所以通过编程来加强自己对于Http协议和Web服务器的理解,也理解下如何实现Web服务请求、响应、错误处理以及CGI协议
一、需要知识点:
1. HTTP 协议基本原理
2. 简单的 Web 服务器框架
3. Python 语言的网络开发
4. Web 服务请求,响应及错误处理的实现
5. CGI 协议的 Python 实现
我用的Python3.5
二、原理:
web 程序都运行在 TCP/IP 协议上, 程序之间使用 socket(套接字)
进行通信,它能够让计算机之间的通信就像写文件和读文件一样简单。 一个 tcp
socket 由一个 IP 地址和端口号组成。
a. IP 地址是一个 32 位的二进制数,通常被分割为 4 个“8 位二进制数”,写成 10
进制的形式就是我们常见的 174.136.14.108。我们通过 IP 地址来标识所连
接的主机。
b. 端口号是一个范围在 0-65535 之间的数字,一台主机上可能同时有多个
sockets,因此需要端口号进行标识。端口号 0-1023 是保留给操作系统使用
的,我们可以使用剩下的端口号。
超文本传输协议(HTTP)描述了一种程序之间交换数据的方法,它非常简单易用,
在一个 socket 连接上, 客户端首先发送请求说明它需要什么, 然后服务器发送响应,
并在响应中包含客户端的数据。响应数据也许是从本地磁盘上复制来的,也许是程
序动态生成的。传输过程如图:
HTTP 请求就是一段文本,任何程序都能生成一个 http 请求,就像生成文本一样简
单。这段文本需要包含以下这些部分:
HTTP method:HTTP 请求方法。最常用的就是 GET (抓取数据)与 POST (更新
数据或者上传文件)
URL: 通常是客户端请求的文件的路径, 比如 /research/experiments.html,
但是是否响应文件都是由服务器决定的。
HTTP version:HTTP 版本。通常是 HTTP/1.0 或 HTTP/1.1
header field:HTTP 头内的键值对,做一些基本设置,就像下面这样:
#客户端接受的数据类型
Accept: text/html
#客户端接受的语言
Accept-Language: en, fr
If-Modified-Since: 16-May-2005
body: 一些与请求有关的负载数据了。比如在一个网站登陆的时候提交登
陆表单,那负载数据就是你的账号与密码信息了。
HTTP 响应的结构类似于请求:
status code:状态码。请求成功响应 200,请求的文件找不到则响应 404。
status phrase:对状态码的描述
下面进行第一个Web服务器, 基本概念十分简单:
1.等待某萌连接我们的服务器并向我们发送一个HTTP请求
2.解析该请求
3.了解该请求希望请求的内容
4.服务器根据请求抓取需要的数据(从服务器本地文件中读取或者程序动态生成)
5.将数据格式化为请求需要的格式
6.送回HTTP响应
上面的1,2,6的操作对所有的WEb应用都是一样的, 这部分内容Python标准库中的BaseHttpServer模块可以帮助我们处理啦。所以现在我们就仅仅需要关注3,4,5了:
首先呢,在工作目录下创建server.py文件:
import BaseHttpServer class RequestHandler(BaseHttpServer.BaseHttpRequestHandler:
"""docstring for RequestHandler(BaseHttpServer.BaseHttpRequestHandler""" #page model
Page = '''\
<html>
<body>
<p>I believe in you, Web!</p>
</body>
</html>
''' #deal with a get request
def do_GET(self):
#super(RequestHandler(BaseHttpServer.BaseHttpRequestHandler, self).__init__()
self.send_response(200)
self.send_header("Content-Type", "text/html")
self.send_header("Content-Length", str(len(self.Page)))
self.end_headers()
self.wfile.write(self.Page)
#-------------colorful Luxuriant lineO(∩_∩)O哈哈~---------- if __name__ == '__main__':
serverAddress = ('127.0.0.1', 5555)
server = BaseHttpServer.HttpServer(serverAddress, RequestHandler)
server.serve_forever()
模块的BaseHttpRequestHandler类可以帮助我们处理对请求的解析,并通过确定请求的方法类调用其所对应的函数, 如当方法是GET时,该类就会调用名为do_GET的方法。RequestHandler继承了BaseHttpRequestHandler并重写了do_GET方法,他的效果可以从代码中所示返回Page的内容。Content-Type告诉客户端要处理html文件的方式处理返回的内容。end_headers方法会插入一个空白行,前面的Request结构图所示可知。
运行程序,打开浏览器访问,此时我们的第一个web服务器就已经完成啦~~
后续会变动下,赶去写作业了。。。。。
可以在Python网站上更好的学习https://wiki.python.org/moin/BaseHttpServer
Python 实现简单的 Web的更多相关文章
- python超简单的web服务器
今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py 1 2 3 #!/usr/bin/python import Simp ...
- python 最简单的web应用(一)
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. server.py文件 #!/usr/bin/env python # -*- coding: ...
- Python实现简单的Web完整版(一)
在拖了一周之后,今天终于在一个小时之内将一个迷你的Web写出来了,最近改其它项目的bug头好大,但是好喜欢这样的状态. 黑色的12月,所有的任务都聚集在了12月,然后期末考试也顾不上好好复习了,但是但 ...
- Python实现简单的Web(续)
写的有点乱..希望大神指教~~Python的缩进可真的将我缠了好久,想起我们班大神说缩进也是代码啊..修改之前的代码来显示请求的信息,同时重新整理一下代码: class RequestHandler( ...
- Python实现简单的Web服务器 解析
代码来源https://www.shiyanlou.com/courses/552,对它进行理解,注释 #-*- coding:utf-8 -*- import BaseHTTPServer clas ...
- python一个简单的web服务器和客户端
服务器: 当客户联系时创建一个连接套接字 从这个连接接收HTTP请求(*) 解释该请求所请求的特定文件 从服务器的文件系统获取该文件 并发送文件内容 ...
- 用Python建立最简单的web服务器
利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 使用python命令构建最简单的web服务
可以使用python自带的包建立最简单的web服务器,使用方法: 1)切换到服务器的根目录下 2)输入命令: python -m SimpleHTTPServer 3)使用wget或者在浏览器访问测试 ...
随机推荐
- webfrom 总结
网上看了很多理论,然而知易行难.在实际工作中还是存在很多问题. 下面是使用webform过程中的总结. 1.不使用服务端控件 表单有post和get两种方法,可以通过 form methed='pos ...
- bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成
bz第233题,用一种233333333的做法过掉了(为啥我YY出一个算法来就是全网最慢的啊...) 题意:求sigma{(i^m)*(m^i),1<=i<=n},n<=10^9,m ...
- 练手小游戏(代码篇之敌人AI
诶呀~又没有更新微博,去拔牙了,疼死了,休息了几天过来接着写代码~ 首先是Base.写了一个框架,照别人扒的. Base分三部分,AILocomotion(AI移动),Steering(行为基类),V ...
- ubuntu修改163软件源
cd /etc/apt cat sources.list sudo su root sudo echo '' > sources.list nano sources.list 复制163软件源 ...
- dom 节点篇
1,创建元素 document.createElement('要创建的元素名'); 2.插入节点 appendChild 和insertBefore 3.删除节点 removeChild 用法 re ...
- iis6 服务器做301跳转返回状态码200解决方法。
倘若你的配置和上图一样的话,在查询返回值是200的情况,你试着把你服务器上的安全狗或者防火墙,还有360网站卫士之类的安全软件停止试试,看是否能正常.
- 四、基于hadoop的nginx访问日志分析---top 10 request
代码: # cat top_10_request.py #!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from mr ...
- UP Board 串口使用心得
前言 原创文章,转载引用务必注明链接. 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我的博客: http://www.cnblogs.com/sjqlwy/p/up_s ...
- 美国usan数据库——PDF提取
QQ:231469242 原创 单个PDF内容提取 # -*- coding: utf-8 -*- """ io.open() is the preferred, hig ...
- Struts2之HelloWorld
首先既然是开发Struts程序的话,那么自然需要用到Struts2开发包,Struts2是apache旗下的开源框架,所有的开发包和源代码都可以在Apache官网下载. 那么,就来开始编写第一个Str ...