日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WSGI服务器实践二--实践一个基本功能的WSGI服务器

發布時間:2025/3/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WSGI服务器实践二--实践一个基本功能的WSGI服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于各種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服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费涩涩视频 | 性做久久 | 婷婷综合国产 | 俄罗斯嫩小性bbwbbw | 日本免费一二区 | 天堂中文在线网 | 在线观看羞羞漫画 | 最新黄色在线 | 成年人www | 亚洲欧美日韩图片 | 9999久久久久 | 国产精品久久久久野外 | 狼人综合伊人 | 日本大尺度吃奶做爰视频 | 国产精品一线二线 | 天堂影视在线观看 | 日韩精品一区二区亚洲av | 欧美影视一区 | 蜜桃av成人 | 2019国产精品视频 | 一区二区视频免费 | 国产主播在线播放 | 精品人伦一区二区三区蜜桃网站 | 欧美精品一区二区蜜臀亚洲 | 精品一区二区三区蜜桃 | 免费在线成人 | 日本我不卡 | 无码精品一区二区免费 | 久久午夜影视 | 免费欧美一级视频 | 欧美日韩午夜精品 | 成年人看的视频网站 | 久射久| 毛片一二三区 | 日韩在线视频网 | 国产最新在线视频 | 老司机午夜剧场 | 黄色成人在线播放 | 午夜黄色小视频 | www.com捏胸挤出奶 | 91爱| 真实的中国女人做爰 | 久久久人人人 | 国产a精品 | 国产精品一二三 | 女女百合高h喷汁呻吟玩具 www.亚洲一区 | 色中文| 免费成人高清 | 日韩中文字幕精品视频 | 亚洲88 | 伊人久久久 | 波多野结衣乳巨码无在线观看 | av一级在线 | 国产一级淫 | 天堂在线中文网 | 福利小视频在线播放 | 欧美日韩一区二区视频观看 | 午夜第一页 | 久久国产中文字幕 | 久插视频 | 中国字幕av | 日韩一级在线视频 | 夜夜操导航 | av资源站 | 国产中文字幕一区 | 嫩草视频在线观看视频 | 鲁大师私人影院在线观看 | 欧美激情伊人 | av小说免费在线观看 | 国产片天天弄 | 特黄特色大片免费 | 日日射夜夜操 | 操夜夜| 丁香社区五月天 | 国产九色视频 | 亚洲欧洲成人在线 | 激情欧美一区二区 | 肉色超薄丝袜脚交69xx | 亚洲精品少妇久久久久久 | av在线黄色 | 国产精品无码免费专区午夜 | 国产精品一区二区无码对白 | 娇小6一8小毛片 | 成人性毛片 | 亚洲视频在线观看网址 | 一本色道av | 欧美在线激情 | 99久久精品免费视频 | 亚洲人妻电影一区 | 四虎永久在线精品免费一区二区 | www中文字幕 | 麻豆网站免费观看 | 国产黄色片免费观看 | 青草视频污 | 日本不卡123| 1024在线视频| 91看毛片| 96视频在线| 亚洲天堂手机版 |