类实现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. bzoj 4842 [Neerc2016]Delight for a Cat 最小费用最大流,线性规划

    题意:有n个小时,对于第i个小时,睡觉的愉悦值为si,打隔膜的愉悦值为ei,同时对于任意一段连续的k小时,必须至少有t1时间在睡觉,t2时间在打隔膜.如果要获得的愉悦值尽 量大,求最大的愉悦值和睡觉还 ...

  2. XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix

    A. Accommodation Plan 对于已知的$K$个点,离它们距离都不超过$L$的点在树上是一个连通块,考虑在每种方案对应的离$1$最近的点统计. 即对于每个点$x$,统计离它距离不超过$L ...

  3. [BZOJ1045][HAOI2008]糖果传递 (环形均分纸牌)

    题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 把|s[i]-s[k]|求和即可,s[i]是A的前缀和 s[k]为s数组的中位数时,总值 ...

  4. nginx Provisional headers are shown

    项目用的Nginx做的代理,重启电脑后,重启项目和Nginx 浏览器报 Provisional headers are shown  解决: host文件添加: 127.0.0.1   cleaner ...

  5. TypeError: 'module' object is not callable

    pkuseg.py 内容如下: import pkusegseg = pkuseg.pkuseg()text = seg.cut('我爱北京天安门')print(text) 原因是py文件名于包名一样 ...

  6. 问题10:获取当前页面宽度JS

    var mleft=document.getElementById("mleft"); var h = document.documentElement.clientHeight; ...

  7. php的imagick模块扩展

    imagick模块介绍       ImageMagick是一个用于查看.编辑位图文件以及进行图像格式转换的开放源代码软件套装.它可以读取.编辑超过100种图象格式,可用来替换GD库. 安装 在加载模 ...

  8. CUDA相关问题

    之前装了GPU驱动后,再装了CUDA 9.0,再装了cuDNN,并且对样例mnistCUDNN进行执行,显示“Test passed!"通过.但是倒忘了有没有测试CUDA是否安装成功.驱动也 ...

  9. css 图片置灰

    .filterGray{ -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(10 ...

  10. python pip 安装模块步骤

    在线安装,cmd输入 命令:pip install mysql-connector-python 注:直接在默认路径下输入