类实现wsgi app

from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server class Simple_App:
def __init__(self,environ,start_response):
self.environ = environ
self.start_response =start_response
status = '200 ok'
headers = [('Content-type','text/plain;charset=utf-8')]
self.start_response(status,headers)
self.ret = ['{}'.format(v).encode() for k,v in self.environ.items()]
def __iter__(self):
yield from self.ret with make_server('0.0.0.0',9000,Simple_App) as httpd:
httpd.serve_forever()

函数实现wsgi,app的方法

from wsgiref.simple_server import make_server

def simple_app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
qstr = environ.get('QUERY_STRING')
# if qstr:
# for pair in qstr.split('&'):
# k,_,v = pair.partition("=")
# print('k={},v={}'.format(k,v))
if qstr:
querydict={k:v for k,_,v in map(lambda x:x.partition("="),qstr.split("&"))}
print(querydict)
start_response(status, headers) ret = [("%s: %s\n" % (key, value)).encode("utf-8")
for key, value in environ.items()]
return ret #返回一个可迭代对象,正文就是这个列表的元素 with make_server('', 8000, simple_app) as httpd:
print("Serving on port 8000...")
print("")
httpd.serve_forever()

理解webob的Request,Response

from webob import Request,Response
from wsgiref.simple_server import make_server
def simple_server(environ,start_response):
request = Request(environ) print(request.params)
response = Response() response.body = b'<h1>hello world<\h1>'
return response(environ,start_response) with make_server('0.0.0.0',9999,simple_server) as httpd:
httpd.serve_forever()

wsgify装饰器的实现

from webob import Request,Response
from wsgiref.simple_server import make_server
from webob.dec import wsgify @wsgify
def app(request:Request)->Response: #一个请求对应一个响应
return Response('<h1>welcome to China</h1>')
  #返回值会被封装成webob.response类型实例的body属性
# return Response(b'<h2>welcome to China 2 </h2>')
# return b'<h3>welcome to China 3</h3>' with make_server('0.0.0.0',9999,app) as httpd:
print('success')
httpd.serve_forever()

wsgi路由实现

from webob import Response,Request
from webob.dec import wsgify
from wsgiref.simple_server import make_server
from webob.exc import HTTPNotFound
import re class Router:
def __init__(self,prefix:str=''):
self.__prefix = prefix
self.routeable = [] #[(method,pattern,handler)] def route(self,pattern,*method): #method is None instead of all of method
def wrapper(handler):
self.routeable.append((tuple(map(lambda x:x.upper(),method)),re.compile(pattern),handler))
return handler
return wrapper
def get(self,pattern):
return self.route(pattern,'GET')
def post(self,pattern):
return self.route(pattern,'POST')
def head(self,pattern):
self.route(pattern,'HEAD')
def match(self,request): #receive browser requset
if not request.path.startswith(self.__prefix):
return
for method,pattern,handler in self.routeable:
if request.method in method or not method:
matcher = pattern.match(request.path.replace(self.__prefix,'',1))
if matcher:
request.groupdict = matcher.groupdict()
return handler(request) class App:
_Routers = []
@classmethod
def regesiter(cls, *routers):
for router in routers:
cls._Routers.append(router)
@wsgify
def __call__(self, request:Request):
for i in self._Routers:
result = i.match(request)
if result:
return result
raise HTTPNotFound('this goes out to homepage') root = Router()
python = Router('/python') #实例设设置了url的前缀
App.regesiter(root,python) @root.get('^/(?P<id>\d+)')
@root.get('^/$')
def roothandler(request:Request):
return Response("<h1>Welcome to roothandler</h1>") @python.get('^/(\w+)')#/python/aa 判断aas是否匹配上url,/python在代码中被替换掉成空
def pythonhandler(request:Request):
return Response('<h1>Welcome to pythonhandler</h1>') if __name__ == '__main__':
with make_server('0.0.0.0',9999,App()) as httpd:
httpd.serve_forever()

wsgi更改路由限定方式

from webob import Response,Request
from webob.dec import wsgify
from wsgiref.simple_server import make_server
from webob.exc import HTTPNotFound
import re class Router:
__regex = re.compile(r'/{([^{}:]+):?([^{}:]*)}')
TYPEPATTERNS = {
'str': r'[^/]+',
'word': r'\w+',
'int': r'[+-]?\d+',
'float': r'[+-]?\d+.\d+',
'any': r'.+'
}
def _repl(self, matcher):
return '/(?P<{}>{})'.format(matcher.group(1), self.TYPEPATTERNS.get(matcher.group(2), self.TYPEPATTERNS['str'])) def __parse(self,src):
return self.__regex.sub(self._repl,src) def __init__(self,prefix:str=''):
self.__prefix = prefix
self.routeable = [] #[(method,pattern,handler)] def route(self,pattern,*method): #method is None instead of all of method
def wrapper(handler):
self.routeable.append((tuple(map(lambda x:x.upper(),method)),re.compile(self.__parse(pattern)),handler))
return handler
return wrapper
def get(self,pattern):
return self.route(pattern,'GET')
def post(self,pattern):
return self.route(pattern,'POST')
def head(self,pattern):
self.route(pattern,'HEAD')
def match(self,request): #receive browser requset
if not request.path.startswith(self.__prefix):
return
for method,pattern,handler in self.routeable:
if request.method in method or not method:
matcher = pattern.match(request.path.replace(self.__prefix,'',1))
if matcher:
request.groupdict = matcher.groupdict()
return handler(request) class App:
_Routers = []
@classmethod
def regesiter(cls, *routers):
for router in routers:
cls._Routers.append(router)
@wsgify
def __call__(self, request:Request):
for i in self._Routers:
result = i.match(request)
if result:
return result
raise HTTPNotFound('this goes out to homepage') root = Router()
python = Router('/python') #实例设设置了url的前缀
App.regesiter(root,python) # @root.get('^/(?P<id>\d+)')
@root.get('^/$')
@root.get(r'^/{id:int}$')
def roothandler(request:Request):
return Response("<h1>Welcome to roothandler</h1>") # @python.get('^/(\w+)')#/python/aa 判断aas是否匹配上url,/python在代码中被替换掉成空
@python.get('^/{id}')
def pythonhandler(request:Request):
return Response('<h1>Welcome to pythonhandler</h1>') if __name__ == '__main__':
with make_server('0.0.0.0',9999,App()) as httpd:
httpd.serve_forever()

重写sub

from webob import Response,Request
from webob.dec import wsgify
from wsgiref.simple_server import make_server
from webob.exc import HTTPNotFound
import re class Router:
__regex = re.compile(r'/{([^{}:]+):?([^{}:]*)}')
TYPEPATTERNS = {
'str': r'[^/]+',
'word': r'\w+',
'int': r'[+-]?\d+',
'float': r'[+-]?\d+.\d+',
'any': r'.+'
} TYPECAST = {
'str': str,
'word': str,
'int': int,
'float': float,
'any': str
} def __parse(self,src: str): #src = {id:int}
start = 0
repl = ''
types = {}
matchers = self.__regex.finditer(src)
for i, matcher in enumerate(matchers):
name = matcher.group(1)
t = matcher.group(2)
types[name] = self.TYPECAST.get(matcher.group(2), str)
repl += src[start:matcher.start()]
tmp = '/(?P<{}>{})'.format(matcher.group(1), self.TYPEATTERNS.get(matcher.group(2), self.TYPEATTERNS['str']))
start = matcher.end()
else:
repl += src[start:]
return repl, types #(r'[^/]+',{id:int}) def __init__(self,prefix:str=''):
self.__prefix = prefix
self.routeable = [] #[(method,pattern,handler)] def route(self,rule,*method): #method is None instead of all of method
def wrapper(handler):
pattern,trans = self.__parse(rule)
self.routeable.append((tuple(map(lambda x:x.upper(),method)),re.compile(pattern),trans,handler))
return handler
return wrapper
def get(self,pattern):
return self.route(pattern,'GET')
def post(self,pattern):
return self.route(pattern,'POST')
def head(self,pattern):
self.route(pattern,'HEAD')
def match(self,request): #receive browser requset
if not request.path.startswith(self.__prefix):
return
for method,pattern,trans,handler in self.routeable:
if request.method in method or not method:
matcher = pattern.match(request.path.replace(self.__prefix,'',1)) #/python/111 ;mathc(111)
if matcher:#{id:111}
newdict = {}
for k,v in matcher.groupdict.items():
newdict[k] = trans[k](v)
request.groupdict = matcher.groupdict()
return handler(request) class App:
_Routers = []
@classmethod
def regesiter(cls, *routers):
for router in routers:
cls._Routers.append(router)
@wsgify
def __call__(self, request:Request):
for i in self._Routers:
result = i.match(request)
if result:
return result
raise HTTPNotFound('this goes out to homepage') root = Router()
python = Router('/python') #实例设设置了url的前缀
App.regesiter(root,python) # @root.get('^/(?P<id>\d+)')
@root.get('^/$')
@root.get(r'^/{id:int}$')
def roothandler(request:Request):
return Response("<h1>Welcome to roothandler</h1>") # @python.get('^/(\w+)')#/python/aa 判断aas是否匹配上url,/python在代码中被替换掉成空
@python.get('^/{id}')
def pythonhandler(request:Request):
return Response('<h1>Welcome to pythonhandler</h1>') if __name__ == '__main__':
with make_server('0.0.0.0',9999,App()) as httpd:
httpd.serve_forever()

Python记录wsgi的更多相关文章

  1. Python的WSGI(Web Server Gateway Interface)服务器

    Python的WSGI(Web Server Gateway Interface)服务器 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. python记录点

    python记录点 文件编码 Unicode使用最少2个字节(1个字节=1BYTE=8bit=一个长度为8的二进制数) 来表示字母和符号等,有时候是4个字节. UTF-8是对Unicode编码的压缩和 ...

  3. Python——eventlet.wsgi

    eventlet 的 wsgi 模块提供了一种启动事件驱动的WSGI服务器的简洁手段,可以将其作为某个应用的嵌入web服务器,或作为成熟的web服务器,一个这样的web服务器的例子就是 Spawnin ...

  4. ubuntu python apache2 wsgi django框架

    在ubuntu上通过apatch2和wsgi部署django (亲手做过!!!) 一,我的python.django.apatch2版本: python:python -V 2.7.3 django: ...

  5. python之WSGI与Guincorn

    WSGI与Guincorn WSGI WSGI (Web Server Gateway Interface),WSGI是为Python语言定义的Web服务器和Web应用程序之间的一种通用接口. 如下图 ...

  6. Python记录1:基础知识常识

    今日内容: 一,Python的数据类型 Python一共有以下几种常见的数据类型:int(整形)  float(浮点型)  str(字符串)  list(列表)   tuple元组  dict(字典) ...

  7. python记录_day019 类的约束 异常处理 日志

    一 .约束 python中约束有两种 第一种,通过抛异常进行约束,这种是子类不按我要求的来,我就给你抛异常(推荐) 操作:提取一个父类. 在父类中给出一个方法.但在方法中不给出任何代码,直接抛异常 # ...

  8. python记录_day10 动态传参 命名空间 作用域

    一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...

  9. python的WSGI接口

    WSGI:Web Server Gateway Interface. WSGI是为python语言定义的web服务器和web应用程序或框架之间的一种简单而实用的接口.wsgi是一个web组件的接口规范 ...

随机推荐

  1. react-native获取设备信息组件(react-native-device-info)

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-acquisition-device-infor ...

  2. [LeetCode] Largest Triangle Area 最大的三角区域

    You have a list of points in the plane. Return the area of the largest triangle that can be formed b ...

  3. ArcGIS Construction Tool OnSketchFinished事件不响应

    使用ArcGIS AddIN ConstructionTool做东西,绘制完Sketch之后,OnSketchFinished事件不响应,没有任何异常与错误. 1.初步问题:OnSketchFinis ...

  4. vscode + electron 提示:无法连接到legacy请采用inspector解决办法

    首先,你的程序是可以直接运行的,在命令行中可以运行,只是在vsCode中,运行一段时间就被这个提示弹出. 解决方法: 先在launch.json 中加上"protocol":&qu ...

  5. Linux系统安装tomcat

    1.首先下载tomcat:http://tomcat.apache.org/download-60.cgi 2.解压缩tar.gz文件: tar -xzvf xxxxxxx/apache-tomcat ...

  6. 转载Alpine Linux常用命令

    Alpine Linux常用命令 目录 一:Alpine Linux开启SSH远程登陆 1.简介: 2.配置 3.配置命令 4.重启服务 二:Alpine Linux源管理 1.简介 2.国内源简介: ...

  7. [03-01]JDBC基础

    JDBC是什么? 1.java Database Connectivity:java访问数据库的解决方案: 2.用相同的方式访问不同的数据库,以实现与具体数据库无关的java操作界面: 3.JDBC定 ...

  8. Ubuntu上hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程

    安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx.x.x ...

  9. linux sed 用法

    目录 Overview 命令行选项 Command-Line Options manual http://www.gnu.org/software/sed/manual/sed.html Overvi ...

  10. composer相关使用

    #composer安装 curl -sS https://getcomposer.org/installer | php #如果该命令执行不了,通过其他方式下载install文件后再执行“php in ...