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. windows环境下批处理实现守护进程

    这个脚本提供两种方式守护,一种是通过进程名,但对于进程名都是java.exe的java程序不适用,另一种是通过netstat查找应用程序所监听的端口是否正在被监听.这两种方式可以在脚本中通过两个冒号注 ...

  2. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

  3. 第八届蓝桥杯c/c++省赛题目整理

    第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都 ...

  4. python学习笔记3-函数的递归

    递归就是指自己函数的自我调用 #递归 #自己调用自己,函数的循环 def test1(): num = int(input('please enter a number:')) if num%2==0 ...

  5. java 创建最大堆

    最大堆的性质是除了根节点之外的所有节点(i)都需要满足A[PARENT(i)]>A[i],即其对应节点值小于其父节点对应值. 下面实现以数组int []a构建最大堆. public class ...

  6. POJ 1185 炮兵阵地 (状态压缩DP)

    题目链接 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用& ...

  7. python 操作 Redis

    目录 Redis 模块基本介绍 参考 redis redis-py 的 API 连接 redis 普通连接 连接池 redis 字符串操作 单次设置key-value 批量设置key-value re ...

  8. vue dev开发环境跨域和build生产环境跨域问题解决

    dev开发时解决请求跨域问题:config-index.js 配置代理dev: { env: require('./dev.env'), port: 8082, assetsSubDirectory: ...

  9. UNIX网络编程 第3章 套接字编程简介

    套接字结构类型和相关的格式转换函数

  10. NOIP 2016 迟来的满贯

    17-03-22,雨 17-03-22,一个特别重要的日子 在这一天,本蒻攻克了NOIP 2016最难的一题,D1T2——天天爱跑步 实现了NOIP 2016的AK! YAYAYAYAYAYAY 自然 ...