python的web框架(1)

1.首先写一个最简单的web服务器,只能给客户回应一个固定的hello world的页面。

from socket import *
from multiprocessing import Process def deal(conn):
recv_data = conn.recv(1024).decode('gb2312')
print(recv_data)
conn.send('HTTP/1.1 200 OK \r\n\r\n <h1>hello world</h1>'.encode('gb2312')) def main():
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(('',8000))
s.listen(1023) while 1:
conn, user_info = s.accept()
print(user_info)
p = Process(target=deal, args=(conn,))
p.start()
conn.close() if __name__ == '__main__':
main()

2.根据用户请求的页面,打开页面文件,读取,并回复给用户,完成多进程web静态页面服务器

#!/usr/bin/env python3
# coding:utf-8 from socket import *
from multiprocessing import Process def deal(conn):
recv_data = conn.recv(1024).decode('gb2312')
recv_data_head = recv_data.splitlines()[0]
print('------', recv_data_head)
request_method, request_path, http_version = recv_data_head.split() # 去掉url中的?和之后的参数
request_path = request_path.split('?')[0] if request_path == '/':
request_path = '/index.html'
file_name = "." + request_path
try:
f = open(file_name, 'rb')
except IOError:
conn.send(b'HTTP/1.1 404 ERROR \r\n\r\n <h1>Page is not exsit .</h1>')
return read_data = f.read()
send_data = b'HTTP/1.1 200 OK \r\n\r\n' + read_data
conn.send(send_data)
f.close() def main():
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(('',8000))
s.listen(1023) while 1:
conn, user_info = s.accept()
print(user_info)
p = Process(target=deal, args=(conn,))
p.start()
conn.close() # 进程会复制出一个新的conn,所以这里的conn需要关闭 if __name__ == '__main__':
main()

3.为了方便操作,可以将之前的函数式编程改成面向对象编程。将所有的方法集成到一个类中,这样更加方便,也更易于使用者了解和使用。

#!/usr/bin/env python3
# coding:utf-8 from socket import *
from multiprocessing import Process class MyWebServer(object): @staticmethod
def deal(conn):
recv_data = conn.recv(1024).decode('gb2312')
recv_data_head = recv_data.splitlines()[0]
print('------', recv_data_head)
request_method, request_path, http_version = recv_data_head.split() # 去掉url中的?和之后的参数
request_path = request_path.split('?')[0] if request_path == '/':
request_path = '/index.html'
file_name = "." + request_path try:
f = open(file_name, 'rb')
except IOError:
conn.send(b'HTTP/1.1 404 ERROR \r\n\r\n <h1>Page is not exsit .</h1>')
return read_data = f.read()
send_data = b'HTTP/1.1 200 OK \r\n\r\n' + read_data
conn.send(send_data)
f.close() def __init__(self):
self.s = socket(AF_INET, SOCK_STREAM)
self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.s.bind(('',8000))
self.s.listen(1023) def start(self):
while 1:
conn, user_info = self.s.accept()
print(user_info)
p = Process(target=self.deal, args=(conn,))
p.start()
conn.close() # 进程会复制出一个新的conn,所以这里的conn需要关闭 s = MyWebServer()
s.start()

python之web框架(1):完成静态页面web服务器的更多相关文章

  1. python之web框架(3):WSGI之web应用完善

    python之web框架(3):WSGI之web应用完善 1.上篇的web框架太low,只能实现回应固定页面.现在将它进行完善.首先将wsgi和web服务器进行分离,并给予它回复静态页面的能力. we ...

  2. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  3. c++ web框架实现之静态反射实现

    0 前言 最近在写web框架,框架写好后,需要根据网络发来的请求,选择用户定义的servlet来处理请求.一个问题就是,我们框架写好后,是不知道用户定义了哪些处理请求的类的,怎么办? 在java里有一 ...

  4. web框架-(一)初识web框架

    一.web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:ut ...

  5. express框架实现承载静态页面的能力

    我们知道nodejs本身不具有一个web容器的作用,不像tomcat或者IIS这样的服务器一样天然具有web容器承载静态动态页面的能力,如果要原生实现的话需要自己通过路由配置,比较麻烦,而expres ...

  6. Python nose单元测试框架结合requests库进行web接口测试

    [本文出自天外归云的博客园] 之前写过一篇关于nose使用方法的博客.最近在做一元乐购产品的接口测试,结合着python的requests库可以很方便的进行web接口测试并生成测试结果.接口测试脚本示 ...

  7. Java Web项目--显示一个静态页面

    我们可以在Eclipse中新建一个Dynamic Web Project,然后在项目的WebContent目录下新建一个Html文件page1.html,其内容如下: <!DOCTYPE htm ...

  8. python使用bs4爬取boss静态页面

    思路: 1.将需要查询城市列表,通过城市接口转换成相应的code码 2.遍历城市.职位生成url 3.通过url获取列表页面信息,遍历列表页面信息 4.再根据列表页面信息的job_link获取详情页面 ...

  9. 【web】movie review——静态页面训练、css训练

    实现样式要求: image: banner.png: generaloverview.png: background.png: bannerbackground.png: rottenbig.png: ...

随机推荐

  1. Spark记录-Scala数据类型

    Scala与Java具有相同的数据类型,具有相同的内存占用和精度.以下是提供Scala中可用的所有数据类型的详细信息的表格: 序号 数据类型 说明 1 Byte 8位有符号值,范围从-128至127 ...

  2. 应用jfinal发送微信模板消息的一个bug

    严格来讲,这不是一个bug,只是我们应用的方式不对.微信发送模板消息的方法是: HttpUtils.post(sendApiUrl + AccessTokenApi.getAccessTokenStr ...

  3. Spring Cloud(十一)声名式服务调用:Feign的使用 (上)

    一.写在前边 最近开发任务比较忙,下班也开始锻炼了,这个系列的文章就放了很久,看github我提交的Feign的入门程序已经好久了,今天正好得空,这就更上一贴,准备分几部分写 注意:之前几个项目中,笔 ...

  4. JS对象中的原型

    对象的原型:每个对象都连接一个原型对象,并且它可以从中继承属性.所有通过对象字面量创建的对象都连接到object.prototype.当你创建一个新对象时,你可以选择某个对象作为它的原型.原型连接在更 ...

  5. Docker 初相见

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...

  6. <P>标签小细节

    html标签对大小写不敏感. 注释:浏览器会自动地在段落的前后添加空行.(<p> 是块级元素) 提示:使用空的段落标记 <p></p> 去插入一个空行是个坏习惯.用 ...

  7. fonts.googleapis.com 字体报错问题解决。

    更多内容推荐微信公众号,欢迎关注: 无法加载这些字体是因为,google的网站在国内无法访问造成的.在AdminLTE.css 和AdminLte.less中有如下内容: @import url(ht ...

  8. 【多视图几何】TUM 课程 第1章 数学基础:线性代数

    在 YouTube 上找到了慕尼黑工业大学(Technische Universitaet München)计算机视觉组 Daniel Cremers 教授的 Multiple View Geomet ...

  9. Strusts2笔记7--国际化

    国际化: 国际化是指,使程序在不做任何修改的情况下,就可以使用在不同的语言环境中.国际化在一般性项目中是不常用的.在编程中简称 i18n. 国际化是通过读取资源文件的形式实现的.资源文件的定义与注册, ...

  10. 内核定时器的使用(好几个例子add_timer)【转】

    转自:http://blog.csdn.net/jidonghui/article/details/7449546 LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个 ...