HTTPServer升级版
1.httpserver
-
前台 前端 客户端 用户端
功能:提供给用户直接使用
要求:
良好的用户体验
更全面的交互功能
很好的和后端进行数据交互
有良好的跨平台性
有一定的优化 -
后台 后端 服务端
功能:逻辑处理、算法实现、 磁盘交互(数据库 静态文件处理)
要求:
健壮性,安全性
并发性能和处理速度
架构合理便于维护扩展
2.网站后端
httpserver + WebFrame
3.功能分析
-
httpserver
获取http请求
解析http请求
将请求发送给WebFrame
从WebFrame接收反馈数据
将数据组织为Rresponse格式发送给客户端 -
WebFrame:
从httpserver接收具体请求
根据请求进行逻辑处理和数据处理
*静态页面
*逻辑数据
将需要的数据反馈给httpserver -
升级点:
1. 采用httpserver和应用处理分离的模式
2. 降低了耦合度
3. 原则上httpserver可以搭配任意的WebFrame
4.项目结构:
HTTPServer中
Httpserver.py
# coding=utf-8
'''
name: lisimeng
time: 2018-10-1
'''
from socket import *
import sys
import re
from threading import Thread # 多线程
from setting import * # 配置文件模块
import time
class HTTPServer(object):
def __init__(self, addr=('0.0.0.0', 80)): # 默认监听80端口
self.sockfd = socket()
self.sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.addr = addr
self.bind(addr)
def bind(self, addr):
self.ip = addr[0]
self.port = addr[1]
self.sockfd.bind(addr)
# HTTP服务器启动
def server_forever(self):
self.sockfd.listen(10)
print('Listen the port %d...' % self.port)
while True:
connfd, addr = self.sockfd.accept()
print('Connect from', addr)
handle_client = Thread(target=self.handle_request, args=(connfd,))
handle_client.setDaemon(True)
handle_client.start()
def handle_request(self, connfd):
# 接收浏览器请求
request = connfd.recv(4096)
request_lines = request.splitlines()
# 获取请求行
request_line = request_lines[0].decode()
# 正则表达式提取请求方法和内容
pattern = r'(?P<METHOD>[A-Z]+)\s+(?P<PATH>/\S*)'
try:
env = re.match(pattern, request_line).groupdict()
except:
response_headlers = 'HTTP/1.1 500 Server Error'
response_headlers += '\r\n'
response_body = 'Server Error'
response = response_headlers + response_body
connfd.send(response.encode())
return
else:
print(env)
# 将请求发送给frame得到返回结果数据
status, response_body = self.send_request(env['METHOD'], env['PATH'])
# 根据响应码组织响应头内容
response_headlers = self.get_headlers(status)
# 将结果组织为http response 发送给客户端
response = response_headlers + response_body
connfd.send(response.encode())
connfd.close()
# 和frame交互,发送request获取response
def send_request(self, method, path):
s = socket()
s.connect(frame_addr)
# 向webframe发送method 和 path
s.send(method.encode())
time.sleep(0.1)
s.send(path.encode())
status = s.recv(128).decode()
response_body = s.recv(4096*10).decode()
return status, response_body
def get_headlers(self, status):
if status == '200':
response_headlers = 'HTTP/1.1 200 OK\r\n'
response_headlers += '\r\n'
elif status == '400':
response_headlers = 'HTTP/1.1 400 Not Found\r\n'
response_headlers += '\r\n'
return response_headlers
if __name__ == "__main__":
httpd = HTTPServer(ADDR)
httpd.server_forever()
#HTTP SERVER配置文件
#httpserver地址
HOST = '0.0.0.0'
PORT = 8000
ADDR = (HOST, PORT)
#WebFrame地址
frame_ip = '127.0.0.1'
frame_port = 8080
frame_addr = (frame_ip, frame_port)
WebFrame中
setting.py
# WebFrame设置
frame_ip = '127.0.0.1'
frame_port = 8080
frame_addr = (frame_ip, frame_port)
# 静态文件存储路径
STATIC_DIR = './static'
#所有可以被访问的URL列表
from views import *
urls = [
('/time', show_time),
('/hello', say_hello),
('/bye', say_bye)
]
from time import ctime
def show_time():
return ctime()
def say_hello():
return "Hello Python"
def say_bye():
return "Good bye"
# coding=utf-8
from socket import *
from setting import *
import time
from ursl import * # 能处理的事务
from views import * #具体方法
class Application(object):
def __init__(self):
self.sockfd = socket()
self.sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.sockfd.bind(frame_addr)
def start(self):
self.sockfd.listen(5)
while True:
connfd, addr = self.sockfd.accept()
# 接收请求方法
method = connfd.recv(128).decode()
# 接收请求内容
path = connfd.recv(128).decode()
print(method, path)
if method == 'GET':
if path == '/' or path[-5:] == '.html':
status, response_body = self.get_html(path)
else:
status, response_body = self.get_data(path)
# 将结果给httpserver
connfd.send(status.encode())
time.sleep(0.1)
connfd.send(response_body.encode())
elif method == 'POST':
pass
def get_html(self, path):
if path == '/':
get_file = STATIC_DIR + '/shows.html'
else:
get_file = STATIC_DIR + path
try:
f = open(get_file)
except IOError:
response = ('404', '===Sorry not found the page===')
else:
response = ('200', f.read())
finally:
return response
def get_data(self, path):
for url, handler in urls:
if path == url:
response_body = handler()
return '200',response_body
return "400", "Sorry,not found the data"
if __name__ == "__main__":
app = Application()
app.start() # 启动框架等待request