侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python实现简易版的Web服务器(推荐)

Python  /  管理员 发布于 7年前   214

下面给大家介绍python实现简易版的web服务器,具体内容详情大家通过本文学习吧!

1、请自行了解HTTP协议

///article/133883.htm(点击跳转)

2、创建Socket服务,监听指定IP和端口

3、以阻塞方式等待客户端连接

4、读取客户端请求数据并进行解析

5、准备服务器运行上下文

6、处理客户端请求数据

7、根据用户请求路径读取文件

8、返回响应结果给客户端

9、程序入口

10、目录结构

11、运行

python wsgiserver.py app:run

12、源码

a.wsgiserver.py文件

#encoding:utf-8import socketimport StringIOimport sysimport loggingfrom datetime import datetimelogger = logging.getLogger(__name__)class WSGIServer(object): address_family = socket.AF_INET socket_type = socket.SOCK_STREAM request_queue_size = 30 recv_size = 1024 def __init__(self, server_address):  self._listen_socket = _listen_socket = socket.socket(self.address_family,   self.socket_type)  _listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)  _listen_socket.bind(server_address)   _listen_socket.listen(self.request_queue_size)    _host, _port = _listen_socket.getsockname()  self._server_name = socket.getfqdn(_host)  self._server_port = _port  self._headers_set = []  self._application = None  self._client = None  self._request_data = None  self._request_method = None  self._path = None  self._request_version = None  self._start_response = None def set_application(self, application):  self._application = application def server_forever(self):   _listen_socket = self._listen_socket  logger.info('listen on %s:%s', self._server_name, self._server_port)  while 1:     try:    self._client, _addr = _listen_socket.accept()    self._handle_request(_addr)   except KeyboardInterrupt as e:    logger.info('interrupt')    break   except BaseException as e:    logger.error(e) def _handle_request(self, client_addr):  self._request_data = _request_data = self._client.recv(self.recv_size)  self._parse_request_data(_request_data)    _env = self._get_environment(client_addr)   _result = self._application(_env, self.start_response)  self._finish_response(_result) def _parse_request_data(self, request_data):   _request_line = str(request_data.splitlines()[0]).rstrip('\r\n')  (self._request_method, self._path, self._request_version) = _request_line.split() def _get_environment(self, client_addr):    _env = {}    _env['wsgi.version'] = (1, 0)    _env['wsgi.url_scheme'] = 'http'  _env['wsgi.input'] = StringIO.StringIO(self._request_data)    _env['wsgi.errors'] = sys.stderr    _env['wsgi.multithread'] = False  _env['wsgi.multiprocess'] = False  _env['wsgi.run_once'] = False  _env['REQUEST_METHOD'] = self._request_method.upper()    _env['PATH_INFO'] = self._path  _env['SERVER_NAME'] = self._server_name  _env['SERVER_PORT'] = self._server_port  _env['HTTP_CLIENT_IP'] = client_addr[0]  logger.info('%s %s %s %s', _env['HTTP_CLIENT_IP'], datetime.now().strftime('%Y-%m-%d %H:%M:%S'), _env['REQUEST_METHOD'], _env['PATH_INFO'])  return _env def start_response(self, status, response_headers, exc_info=None):   _server_headers = [   ('Date', 'Sun, 7 Jun 2015 23:07:04 GMT'),   ('Server', 'WSGIServer 0.1')   ]  self._headers_set = [status, response_headers + _server_headers] def _finish_response(self, result):    _status, _response_headers = self._headers_set  _response = 'HTTP/1.1 {status}\r\n'.format(status=_status)    for _header in _response_headers:    _response += '{0}:{1}\r\n'.format(*_header)    _response += '\r\n'  for _data in result:      _response += _data  self._client.sendall(_response)  self._client.close()def make_server(server_address, application): server = WSGIServer(server_address) server.set_application(application) return serverif __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) server_addr= ('0.0.0.0', 43002) app_path = sys.argv[1] module, application = app_path.split(':') module = __import__(module) application = getattr(module, application) httpd = make_server(server_addr, application) httpd.server_forever()

b.app.py文件

#encoding:utf-8import osclass PageNotFoundException(BaseException): passdef render(filename, dirname='html'): _path = os.path.join(dirname, filename) if os.path.exists(_path):    with open(_path, 'rb') as handler:     return handler.read() raise PageNotFoundException('file not found:%s' % _path)def run(env, start_response): _path = env.get('PATH_INFO') response = '' try:  _path = 'index.html' if _path == '/' else _path[1:]  if _path.endswith('.css'):   start_response('200 OK', [('Content-Type', 'text/css')])  elif _path.endswith('.js'):   start_response('200 OK', [('Content-Type', 'text/javascript')]  elif _path.endswith('.html'):   start_response('200 OK', [('Content-Type', 'text/html')])  else:   start_response('200 OK', [('Content-Type', 'text/plain'), ('Content-Disposition', 'attachment; filename=%s' % os.path.basename(_path))])  response = render(_path)  except PageNotFoundException as e:  response = render('404.html')  return [response, '\r\n']

总结

以上所述是小编给大家介绍的Python实现简易版的Web服务器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!


  • 上一条:
    python实现识别手写数字 python图像识别算法
    下一条:
    python实现图像识别功能
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客