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组件的接口规范 ...
随机推荐
- 第四篇flask中模板语言 jinja2
Flask中默认的模板语言是Jinja2 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {, 'gender': '中'}, STUDENT_LIST = [ {, 'gende ...
- SDOI2019 省选前模板整理
目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay ...
- python学习:输入中文
输入中文 python2 输入中文:#!-*- coding:utf-8 -*-(或者#coding:utf-8)例如: msg = u"我爱北京天安门!" print msg p ...
- timesten 修改最大连接数
修改完/var/Timesten/sys.odbc.ini里面的connections之后 重启TT:ttdaemonadmin -restart 报错:15019: Only the instanc ...
- Solve fatal error: helper_math.h: No such file or directory
When the 'fatal error: helper_math.h: No such file or directory' occurs, it means the 'helper_math.h ...
- puppeteer 填充基础表单
main.js const pptr = require("puppeteer"); const gotoUrl = "http://127.0.0.1:5500/ind ...
- JavaBean,POJO,VO,DTO的区别和联系
JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...
- ORACLE PL/SQL编程:把触发器说透
本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...
- ecshop 2.x 3.x sql injection/rce payload
首先,感谢ringk3y的分析:http://ringk3y.com/2018/08/31/ec ... %E6%89%A7%E8%A1%8C/ 大家跟一遍代码基本上都能弄明白漏洞的原理,整个漏洞的构 ...
- 壁虎书8 Dimensionality Reduction
many Machine Learning problems involve thousands or even millions of features for each training inst ...