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或者在浏览器访问测试 ...
随机推荐
- webstorm 常用快捷键
webstorm应该是目前最强的js编辑器了,结合sublime text可以很效率的开发项目.今天整理了一些webstorm比较实用的快捷键: Ctrl+/ 或 Ctrl+Shift+/ 注释(// ...
- python三大类型数据筛选
如何在列表,字典,集合中根据条件刷选数据 说明: 本文分析的类型: 列表 字典 集合 结合每种类型筛选数据的方法的不同,区分出方法间的差异. 一.列表案例 需求:过滤掉列表中的负数. li = [1, ...
- RabbitMQ 集群之镜像同步
mirrored 在上个博文中讲到了如果做集群,那么集群是成功了,但是queue是如何存放的呢?消息又是怎么同步呢. 默认的,也就是什么也不配置,直接在某个节点中添加一个queue,那么它仅仅是属于这 ...
- Android ooVoo Apk附件关联分析
为什么要分析附件关联 发送和接收的图片以及头像等从网上下载的存储在手机的sdcard上面以转换后的名字命名,需要分析数据库中的记录所对应的sdcard的文件才能关联.比如数据库存储是http://oo ...
- Yii2开启enableprettyurl(url美化)无效
最终显示的url格式为:http://localhost/yii2/frontend/web/site/about 在/config/main.php中 'components'=>[] 中添加 ...
- asp.net mvc bootstrap datatable 服务端分页
datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 先上图[ jqueryui风格] 前端代码: @{ Layout = null;} <!DO ...
- javaScript timer控制
<script type="text/javascript"> ; //间隔一秒循环执行 var id = setInterval(function () { num ...
- 二、基于hadoop的nginx访问日志分析---计算日pv
代码: # pv_day.py#!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from nginx_accesslog ...
- form表单的属性标签
form表单的常用标签 表单: <form id="" name="" method="post/get" action=" ...
- jquery 返回顶部 兼容web移动
返回顶部图片 http://hovertree.com/texiao/mobile/6/tophovertree.gif 具体实现代码 <span id="tophovertree&q ...