国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現簡易版的Web服務器(推薦)

2020-02-22 23:01:45
字體:
來源:轉載
供稿:網友

下面給大家介紹python實現簡易版的web服務器,具體內容詳情大家通過本文學習吧!

1、請自行了解HTTP協議

//www.jb51.net/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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柏乡县| 金沙县| 中西区| 内黄县| 彰武县| 岑巩县| 禄丰县| 荆州市| 乐清市| 无锡市| 江川县| 仙游县| 民勤县| 舒城县| 临邑县| 安塞县| 彰武县| 互助| 乡宁县| 莱芜市| 潮安县| 兴业县| 县级市| 夏津县| 开原市| 高台县| 永丰县| 沁阳市| 梅河口市| 桦南县| 临夏市| 汪清县| 威海市| 文昌市| 吉木萨尔县| 廉江市| 秭归县| 敖汉旗| 盐城市| 赤城县| 大宁县|