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组件的接口规范 ...
随机推荐
- XVII Open Cup named after E.V. Pankratiev. GP of Two Capitals
A. Artifact Guarding 选出的守卫需要满足$\max(a+b)\leq \sum a$,从小到大枚举每个值作为$\max(a+b)$,在权值线段树上找到最大的若干个$a$即可. 时间 ...
- CSS(五)
定位 关于定位 我们可以使用css的position属性来设置元素的定位类型,postion的设置项如下: relative 生成相对定位元素,元素所占据的文档流的位置不变,元素本身相对文档流的位置进 ...
- 重构file_get_contents实现一个带超时链接访问的函数
function wp_file_get_contents($url, $timeout = 30) { $context = stream_context_create(array( 'http' ...
- css3图形绘制
以下几个例子主要是运用了css3中border.bordr-radius.transform.伪元素等属性来完成的,我们先了解下它们的基本原理. border:简单的来说border语法主要包含(bo ...
- Jmeter遇到打不开的问题
1.JDK的版本,一定版本的jmeter需要特定版本以上的JDK支持,比如此次运行的apache-jmeter-2.12,就需要JDK1.6以上的版本支持.我原来装的是JDK1.5,配置好JMETER ...
- verilog中signed的使用
1.在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其 ...
- C++接口与实现的抽象分离
IPerson.h #ifndef I_PERSON_H_ #define I_PERSON_H_ #include <string> #include <ostream> c ...
- 关于python字符串基本操作
python字符串基本操作,比如字符串的替换.删除.截取.复制.连接.分割等.都是一些关于字符串的一些方法.下面来列举一些,相信对学习python还是有些帮助的. 1.去除空格--strp(): &g ...
- Express全系列教程之(一):Express的安装 和第一个程序
前言 ndoe.js,一个基于javsscript运行环境的服务器语言,它的出现使得javascript有能力去实现服务器操作.在gitHub上ndoe.js的star数已接近6万,可见其受欢迎程度: ...
- oracle 约束与索引
1.约束 1.not null(列表不为空) create table 表名(列名1 列表属性2 not null,列名1 列表属性2 not null); 2.unique(列表不能重复) crea ...