python-实现动态web服务器
# encoding=utf-8
import socket
from multiprocessing import Process
import re
import sys # 设置静态文件根目录
HTML_ROOT_DIR = './html' WSGI_PYTHON_DIR = './wsgipython' class HTTPServer(object):
def __init__(self, application):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.app = application def start(self):
self.server_socket.listen(128)
while True:
client_socket, client_address = self.server_socket.accept()
# print("[%s, %s]用户连接上了" % (client_address[0], client_address[1]))
print("[%s, %s]用户连接上了" % client_address)
handle_client_process = Process(target=self.handle_socket, args=(client_socket,))
handle_client_process.start()
client_socket.close() def start_response(self, status, headers):
"""
status="200 ok"
headers = [
('Content-Type', 'text/plain')
] :param status:
:param headers:
:return:
""" response_headers = "HTTP1.1 " + status + "\r\n"
for header in headers:
response_headers += "%s: %s\r\n" % header self.response_headers = response_headers def handle_socket(self, client_socket):
"""处理客户端请求"""
# 获取客户端请求数据
request_data = client_socket.recv(1024)
print("request data: ", request_data)
request_lines = request_data.splitlines()
for request_line in request_lines:
print(request_line) # 解析请求报文
# 'GET / HTTP/1.1'
request_start_line = request_lines[0]
print('&' * 20)
print(type(request_start_line))
# 提取用户请求的文件名
print('*' * 10)
print(request_start_line.decode('utf-8'))
file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode('utf-8')).group(1)
method = re.match(r"(\w+) +/[^ ]* ", request_start_line.decode('utf-8')).group(1) print(file_name)
# 将路由的分发交给框架去做 ====================================================
# # "/ctime.py"
# # "/sayhello.py"
# if file_name.endswith('.py'):
# a = file_name[1:-3]
# try:
# m = __import__(file_name[1:-3])
# except Exception:
# self.response_headers = "HTTP/1/1 404 Not Found\r\n"
# response_body = 'not found'
# else:
# env = {
# "PATH_INFO": file_name,
# 'METHOD': method
# }
#
# response_body = m.application(env, self.start_response)
#
# response = self.response_headers + '\r\n' + response_body
#
# else:
# if '/' == file_name:
# file_name = '/index.html'
#
# # 打开文件,读取内容
# try:
# file = open(HTML_ROOT_DIR + file_name, "rb")
# except IOError:
# response_start_line = 'HTTP/1.1 404 Not Found\r\n'
# response_headers = 'Server: Myserver\r\n'
# response_body = 'The file is not found!'
# else:
# file_data = file.read()
# file.close()
#
# # 构造响应数据
# response_start_line = 'HTTP/1.1 200 OK\r\n'
# response_headers = 'Server: Myserver\r\n'
# response_body = file_data.decode('utf-8')
# print('??' * 20)
# print(type(response_body))
#
# response = response_start_line + response_headers + '\r\n' + response_body
# print('response data:', response) env = {
"PATH_INFO": file_name,
'METHOD': method
}
response_body = self.app(env, self.start_response)
response = self.response_headers + '\r\n' + response_body # 向客户端返回响应数据
client_socket.send(bytes(response, 'utf-8')) # 关闭客户端连接
client_socket.close() def bind(self, port):
self.server_socket.bind(("", port)) def main():
sys.path.insert(1, WSGI_PYTHON_DIR)
if len(sys.argv) < 2:
sys.exit("python MyWebServer_v1.py Module:app")
# python MyWebServer_v1.py MyWebFrameWork:app
module_name, app_name = sys.argv[1].split(":")
# module_name = "MyWebFrameWork"
# app_name = "app"
m = __import__(module_name)
app = getattr(m, app_name)
http_server = HTTPServer(app)
# http_server.set_port
http_server.bind(9000)
http_server.start() if __name__ == '__main__':
main()
框架的实现
MyWebFrameWork_v2.py
# coding:utf-8 import time # 设置静态文件根目录
HTML_ROOT_DIR = "./html" class Application(object):
"""框架的核心部分,也就是框架的主题程序,框架是通用的"""
def __init__(self, urls):
# 设置路由信息
self.urls = urls def __call__(self, env, start_response):
path = env.get("PATH_INFO", "/")
# /static/index.html
if path.startswith("/static"):
# 要访问静态文件
file_name = path[7:]
# 打开文件,读取内容
try:
file = open(HTML_ROOT_DIR + file_name, "rb")
except IOError:
# 代表未找到路由信息,404错误
status = "404 Not Found"
headers = []
start_response(status, headers)
return "not found"
else:
file_data = file.read()
file.close() status = "200 OK"
headers = []
start_response(status, headers)
return file_data.decode("utf-8") for url, handler in self.urls:
#("/ctime", show_ctime)
if path == url:
return handler(env, start_response) # 代表未找到路由信息,404错误
status = "404 Not Found"
headers = []
start_response(status, headers)
return "not found" def show_ctime(env, start_response):
status = "200 OK"
headers = [
("Content-Type", "text/plain")
]
start_response(status, headers)
return time.ctime() def say_hello(env, start_response):
status = "200 OK"
headers = [
("Content-Type", "text/plain")
]
start_response(status, headers)
return "hello frawework" def say_haha(env, start_response):
status = "200 OK"
headers = [
("Content-Type", "text/plain")
]
start_response(status, headers)
return "hello haha" urls = [
("/", show_ctime),
("/ctime", show_ctime),
("/sayhello", say_hello),
("/sayhaha", say_haha),
]
app = Application(urls)
运行上述代码需要pycharm中配置
服务器程序--Edit Configurations....
python-实现动态web服务器的更多相关文章
- python网络-动态Web服务器案例(30)
一.浏览器请求HTML页面的过程 了解了HTTP协议和HTML文档,其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作 ...
- python 启动简单web服务器
有时我们在开发web静态页面时,需要一个web服务器来测试. 这时可以利用python提供的web服务器来实现. 1.在命令行下进入某个目录 2.在该目录下运行命令: python -m Simple ...
- 利用Python实现对Web服务器的目录探测
今天是一篇提升技能的干货分享,操作性较强,适用于中级水平的小伙伴,文章阅读用时约3分钟. PART 1/Python Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python ...
- 利用 python 实现对web服务器的目录探测
一.pythonPython是一种解释型.面向对象.动态数据类型的高级程序设计语言.python 是一门简单易学的语言,并且功能强大也很灵活,在渗透测试中的应用广泛,让我们一起打造属于自己的渗透测试工 ...
- 基于python实现简单web服务器
做web开发的你,真的熟悉web服务器处理机制吗? 分析请求数据 下面是一段原始的请求数据: b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nConnectio ...
- 用python快速搭建WEB服务器
cmd下进入你要搞WEB项目的目录 输入↓方代码 python -m SimpleHTTPServer 端口号# 默认是8000 这样就启动了一个简单的WEB服务器
- python下的web服务器模块
python下的web服务模块有三种: BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler SimpleHTTPS ...
- <5>Python的uwsgi web服务器
一.是什么? uWSGI是web服务器,用来部署线上web应用到生产环境.uWSGI实现了WSGI协议.uwsgi协议.http协议.WSGI(Web Server Gateway Interface ...
- python网络-静态Web服务器案例(29)
一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...
- Python实现简易Web服务器
1.请自行了解HTTP协议 http://www.cnblogs.com/reboot51/p/8358129.html(点击跳转) 2.创建Socket服务,监听指定IP和端口 3.以阻塞方式等待 ...
随机推荐
- 2020ICPC上海I - Sky Garden
思维 [I-Sky Garden_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)(重现赛)@hzy0227 (nowcoder.com)](https://codeforces.co ...
- python 识别登陆验证码图片(完整代码)
在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记. 首选导入一些用到的库,re.Imag ...
- 【Python】Python多进程练习
1,进程启动 通过Process方法启动,通过下面的代码执行结果,可以发现,开启的进程与WHILE循环语句会同时进行. 为什么呢?因为都是启动了进程在运行程序. from time import sl ...
- 解决PageHelper分页不正常,pages始终等于1,total 始终等于pageSize的问题
问题 pages始终等于1,total 始终等于pageSize 原因 原因是我在查询到list数据之后,对list做了操作,导致分页不正常 // 这是service层的类 public PageIn ...
- Java基础——控制语句、switch结构与三元运算符
package com.zhao.demo; public class Demo03 { public static void main(String[] args) { int num=1; swi ...
- Leetcode48 旋转图像
48. 旋转图像 难度中等432 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵 ...
- pyqt5 弹窗大全--修复版
1 from PyQt5.QtWidgets import * 2 from PyQt5.QtCore import Qt, pyqtSignal, QTimer 3 4 5 class MyWind ...
- 解决tomcat8080端口占用问题
解决tomcat8080端口占用问题 1. 使用管理员权限打开cmd 2. 输入 netstat -ano | findstr 8080 找出占用8080端口的进程pid netstat -ano | ...
- git 代码托管常用代码
一.git全局账号登录 (1)全局登录账号和密码 git config --global user.name "xxx" git config --global user.emai ...
- MyBatis Plus 设置ID的自增 /非自增时遇到的问题
非自增时 自己设置ID 其他可参考------>主键策略的几种类型 https://blog.csdn.net/hxyascx/article/details/105401767