Python记录wsgi
类实现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的更多相关文章
- Python的WSGI(Web Server Gateway Interface)服务器
Python的WSGI(Web Server Gateway Interface)服务器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- python记录点
python记录点 文件编码 Unicode使用最少2个字节(1个字节=1BYTE=8bit=一个长度为8的二进制数) 来表示字母和符号等,有时候是4个字节. UTF-8是对Unicode编码的压缩和 ...
- Python——eventlet.wsgi
eventlet 的 wsgi 模块提供了一种启动事件驱动的WSGI服务器的简洁手段,可以将其作为某个应用的嵌入web服务器,或作为成熟的web服务器,一个这样的web服务器的例子就是 Spawnin ...
- ubuntu python apache2 wsgi django框架
在ubuntu上通过apatch2和wsgi部署django (亲手做过!!!) 一,我的python.django.apatch2版本: python:python -V 2.7.3 django: ...
- python之WSGI与Guincorn
WSGI与Guincorn WSGI WSGI (Web Server Gateway Interface),WSGI是为Python语言定义的Web服务器和Web应用程序之间的一种通用接口. 如下图 ...
- Python记录1:基础知识常识
今日内容: 一,Python的数据类型 Python一共有以下几种常见的数据类型:int(整形) float(浮点型) str(字符串) list(列表) tuple元组 dict(字典) ...
- python记录_day019 类的约束 异常处理 日志
一 .约束 python中约束有两种 第一种,通过抛异常进行约束,这种是子类不按我要求的来,我就给你抛异常(推荐) 操作:提取一个父类. 在父类中给出一个方法.但在方法中不给出任何代码,直接抛异常 # ...
- python记录_day10 动态传参 命名空间 作用域
一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...
- python的WSGI接口
WSGI:Web Server Gateway Interface. WSGI是为python语言定义的web服务器和web应用程序或框架之间的一种简单而实用的接口.wsgi是一个web组件的接口规范 ...
随机推荐
- Android 多媒体 播放音视频
1.播放音频 因为涉及到读取文件,所以需要申请权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_S ...
- webpack 打包测试和生产多个版本
cross-env修改生产环境变量 npm i --save-dev cross-env 在package.json里这么配置 npm run build就是打包到生产环境 npm run build ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习7
#include <iostream>#include <cstring>const MAXSIZE=100;using namespace std;int main (){ ...
- Hadoop双namenode配置搭建(HA)
配置双namenode的目的就是为了防错,防止一个namenode挂掉数据丢失,具体原理本文不详细讲解,这里只说明具体的安装过程. Hadoop HA的搭建是基于Zookeeper的,关于Zookee ...
- JavaScript的正则表达式的基础
正则表达式:* 具体字符(字面值)*字符边界*字符集合[ace],[0123456789]*字符补集[^ qxz]: 不在qxz范围内*字符范围[a-z 0-9]*字符簇(系统定义好的常用集合)--- ...
- [LeetCode] Global and Local Inversions 全局与局部的倒置
We have some permutation A of [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...
- ASPOSE.Word 开发资料整理
1.总体说明:操作主要涉及两个对象Document及DocumentBuilder Document主要用来获取文档中的节点,DocumentBuilder主要用于实现文档内容的写入 doc_Oper ...
- 64bit program invoke 32bit library with rpcgen
https://www.cnblogs.com/ddk3000/p/5051108.html 这篇博客介绍了一种用rpc的方法实现64位程序调用32位动态库的方法,核心是利用rpcgen简化了进程间通 ...
- Python读取xlsx翻译文案
首先安装Python,然后安装模块 //查找模块(非必须) pip search xlrd //安装模块 pip install xlrd 由于输出要是utf-8所以需要设置默认环境为utf-8 # ...
- in与exists和not in 与 not exists的区别
1.in 与 exists: 外表大,用IN:内表大,用EXISTS: 原理: 用in:外表使用了索引,直接作hash连接: 用exists:内表使用了索引,外表作loop循环再进行匹配: 2.not ...