由于各种PYTHON框架都实现了WSGI接口,所以,通用性很广的。

在调试过程过,有一个字母拼错,搞了一个小时。

看来PYTHON自带的编辑器没有高亮,不爽。

在有提示的编辑器里一看就看了来啦。。:)

webserver.py

import socket
import StringIO
import sysclass WSGIServer(object):address_family = socket.AF_INETsocket_type = socket.SOCK_STREAMrequest_queue_size = 1def __init__(self, server_address):# Create a listening socketself.listen_socket = listen_socket = socket.socket(self.address_family,self.socket_type)# Allow to reuse the same addresslisten_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# Bind
        listen_socket.bind(server_address)# Active
        listen_socket.listen(self.request_queue_size)# Get server host name and porthost, port = self.listen_socket.getsockname()[0:2]self.server_name = socket.getfqdn(host)self.server_port = port# Return headers set by web framework/Web applicationself.headers_set = []def set_app(self, application):self.application = applicationdef serve_forever(self):listen_socket = self.listen_socketwhile True:# New client connectionself.client_connection, client_address = listen_socket.accept()# Handle one request and close the client connection. Then# loop over to wait for another client connection
            self.handle_one_request()def handle_one_request(self):self.request_data = request_data = self.client_connection.recv(1024)# Print formatted request data a la 'curl -v'print(''.join('< {line} \n'.format(line=line)for line in request_data.splitlines()))self.parse_request(request_data)# Construct environment dictionary using requst dataenv = self.get_environ()# It's time to call our application callable and get# back a result that will become HTTP response bodyprint 'self.application: ********************', self.applicationresult = self.application(env, self.start_response)# Construct a response and send it back to the client
        self.finish_response(result)def parse_request(self, text):request_line = text.splitlines()[0]request_line = request_line.rstrip('\r\n')# Break down the request line into components(self.request_method, #GETself.path, #/helloself.request_version # HTTP/1.1) = request_line.split()def get_environ(self):env = {}# The following code snippet does not follow PEP8 conventions# but it's formatted the way it is for demonstration purposes# to emphasize the required variables and their values#
        # Required WSGI variablesenv['wsgi.version']      = (1, 0)env['wsgi.url_scheme']   = 'http'env['wsgi.input']        = StringIO.StringIO(self.request_data)env['wsgi.errors']       = sys.stderrenv['wsgi.multithread']  = Falseenv['wsgi.multiprocess'] = Falseenv['wsgi.run_once']     = False# Required CGI variablesenv['REQUEST_METHOD']    = self.request_method    # GETenv['PATH_INFO']         = self.path              # /helloenv['SERVER_NAME']       = self.server_name       # localhostenv['SERVER_PORT']       = str(self.server_port)  # 8888return envdef start_response(self, status, response_headers, exc_onfo=None):# Add necessary server headersserver_headers = [('Date', 'Tue, 31 Mar 2015 12:54:48 GMT'),('Server', 'WSGIServer 02'),]self.headers_set = [status, response_headers + server_headers]# To adhere to WSGI specification the start_response must return# a 'write' callable. We simplicity's sake we'll ignore that detail# for now.# return self.finish_responsedef finish_response(self, result):try:status, response_headers = self.headers_setresponse = '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# Print formatted response data a la 'curl -v'print(''.join('> {line}\n'.format(line=line)for line in response.splitlines()))self.client_connection.sendall(response)finally:self.client_connection.close()SERVER_ADDRESS = (HOST, PORT) = '', 8888def make_server(server_address, application):server = WSGIServer(server_address)server.set_app(application)return serverif __name__ == '__main__':if len(sys.argv) < 2:sys.exit('Provide a WSGI application object as module:callable')app_path = sys.argv[1]module, application = app_path.split(':')module = __import__(module)application = getattr(module, application)httpd = make_server(SERVER_ADDRESS, application)httpd.serve_forever()print("WSGIServer: Serving HTTP on port {port}...\n".format(port=PORT))

wsgiapp.py

def app(environ, start_response):""" A barebones WSGI application.This is a starting point for you own Web Framework :)"""status = '200 OK'response_headers = [('Content-Type', 'text/plain')]start_response(status, response_headers)return ['Hello world from a simple WSGI application!\n']

运行命令:

python webserver.py wsgiapp:app

结果:

WSGI服务器实践二--实践一个基本功能的WSGI服务器相关推荐

  1. 求生之路寻找延迟服务器,用centos搭建一个简单的求生之路2服务器(用于好友联机降低延迟,不包含插件)...

    由于和好友联机玩求生之路2时经常出现mod兼容性问题和高ping值问题,游戏体验非常差,而且官方服务器并不能支持第三方地图,所以我们决定自己搭建一个服务器. 不过不知道什么原因,网上关于搭建l4d2服 ...

  2. 家人共享为什么显示服务器失败,App 支持 “家人共享”功能 App Store服务器通知更新...

    昨日,苹果面向开发者宣布,AppStore 服务器通知更新. IT之家了解到,如果 App 支持 "家人共享"功能,开发者现在可以接收新的 AppStore 服务器通知,来了解家庭 ...

  3. portal无线认证服务器,无线AC配置portal认证功能portal 认证服务器问题

    看了下官方portal认证的介绍,关于portal认证服务器和portal web服务器的配置如下: 配置Portal认证 # 配置Portal认证服务器,名称为newpt,IP地址为192.168. ...

  4. flask+uwsgi+supervisor+nginx在局域网服务器上部署实践

    flask可以快速的搭建http服务,但是为了搭建网站还是需要web服务器和相关监控管理操作,一套flask.uwsgi.supervisor.nginx是较好的完整解决方案. 本文对自己学习做一个记 ...

  5. 介绍Windows Server服务器角色、角色服务和功能

    1.1 服务器角色.角色服务和功能 什么是服务器角色.角色服务和功能? 本部分定义适用于 Windows Server 2008 的术语:角色.角色服务和功能. 角色 Roles是出现Windows ...

  6. php报表服务器配置,服务器_SQL Server 2008升级报表服务器数据库,报表服务器数据库可以为一个 - phpStudy...

    SQL Server 2008升级报表服务器数据库 报表服务器数据库可以为一个或多个报表服务器实例提供内部存储.因为报表服务器数据库架构可能会因为推出新的 Reporting Services 版本而 ...

  7. 魔兽怀旧服一个服务器最多人数,魔兽怀旧服:比灰烬排队人数还多的服务器,仅此一个,过于平衡!...

    游戏中我们是朋友,聊天侃地,在这里我们可以无拘无束地发言,不会有任何人阻挠,还有大家最喜欢喷的小编,请把口水收集好,随时准备和小编一起对喷! 魔兽怀旧服比灰烬排队人数还多的服务器,仅此一个,过于平衡! ...

  8. linux查询服务器的dns,如何查看Linux系统中DNS服务器的运行状况

    DNS是分布式数据库,可以让用户们方便访问互联网,而主机的dns服务器也直接影响了我们上网及访问网站的速度,那么你知道如何查看Linux系统中DNS服务器的运行状况吗? 在Linux环境下,也提供了广 ...

  9. xp系统更新的服务器失败是怎么回事啊,xp系统显示“服务器错误500”的两种解决方法...

    xp纯净版系统在浏览网页的时候会遇到这样或者那样的错误,比如经常遇到404错误,503错误,怎么回事呢?这些都是HTTP的状态码,不同的状态码代表不同的错误类型,有些不常用的状态码便没有详细的记载,例 ...

最新文章

  1. Nhibernate常见的错误
  2. 1041 Be Unique
  3. Java【快速排序、插入排序、简单选择排序...】【八大排序-综合实验】
  4. linux中临时、永久修改ip
  5. 微信 语音转文字 java,在微信——怎么将语音转化为文字,你需要学习了
  6. python如何运行一个python程序_python如何运行?第一个python小程序示范
  7. 通过JAVA操作SAE上的MY SQL数据库
  8. pytorch:定义自己的网络结构
  9. Spring的注解@Autowired和@Resource的区别
  10. django 名词解释
  11. lintcode triangle 数字三角形
  12. 今年11月初阿里巴巴社招面试经历分享,Java工程师方向已拿offer【附学习方法】
  13. 文件/文件夹强制删除工具:IObit Unlocker绿色版
  14. npm安装报错(npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path C:\Program Files\nodejs\node_ca...)
  15. 微信小程序调用地图和跟据经纬度打开手机地图导航
  16. pstack/gstack
  17. php5 geoip,php5.2 geoip pecl模块安装
  18. 谈谈BPM工作流引擎
  19. javaweb对于高并发策略--限流
  20. Dubbo + Zipkin + Brave 实现全链路追踪

热门文章

  1. Red Hat Enterprise Linux (RHEL) 6.4 DVD ISO 迅雷下载地址
  2. windows10双系统安装ubuntu18.04
  3. 题解 P5065 【[Ynoi2014]不归之人与望眼欲穿的人们】
  4. python标准库--functools.partial
  5. 中台到底是什么?传统企业怎样建设中台?
  6. 诺基亚:你以为他死了,他却靠这一点重回世界第二
  7. 平均月薪超过1万的北京人是这样上班的|大数据解读(视频)
  8. STM32之定时器原理
  9. 拿到大厂Offer了!
  10. 程超:突破瓶颈!如何不断的提高自己