您的位置:首页 > 其它

web开发 wsgief 小试牛刀:一个简易的server:envrion 、start_respo

2018-01-07 21:08 711 查看
Python中的 WSGI的实现

wsgief
是一个用于参考库,不能真正用到生产,用于实验阶段使用

导入模块
import wsgiref
例:一个简单的server
导入模块
from wsgiref.simple_server import make_server, demo_app
ip = '127.0.0.1'port = 9999server = make_server(ip,port,demo_app) #启动一个wsgi服务器server.serve_forever() #接收request server.server_close() #处理完后关闭请求
访问这个地址可以看到我们当前环境的具体信息

查看源码
还是app_daemon的代码如下:
def demo_app(environ,start_response): #environ是包含http请求信息的字典对象 from io import StringIO stdout = StringIO() print("Hello world!", file=stdout) print(file=stdout) h = sorted(environ.items()) for k,v in h: print(k,'=',repr(v), file=stdout) start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')]) return [stdout.getvalue().encode("utf-8")]
前端打印一个hello word,并全部打印当前环境

envrion
#包含http请求信息的字典对象
用于存放访问的各种信息

start_response
#返回的是response hander,返回可迭代对象是内容body
用于以二元组方式存放进列表,来模拟一个字典,但按照下一步必须要求返回可迭代对象,里面则是正文内容

envrion是回调,将这个拿到通过赋给h做一些传递
h = sorted(envrion.items())
当h获取到,将标准输出拿出将其编码返回回去
for k,v in h: print(k,'=',repr(v),filter=stdout()) start_response('200 OK') return {stdout.getvalue().encode('utf-8')}

封装一个函数做web

def app(environ,start_response): print(type(environ)) html = "<h1>hello</h1>" start_response("200 OK", [('Content-Type','text/html; charset=utf-8')]) return [html.encode()] ip = '127.0.0.1'port = 9999server = make_server(ip,port,app) server.serve_forever()server.server_close()

代码解释:
业务逻辑需要解决的返回的呈现内容
html = "<h1>hello</h1>"
函数的约定:返回头部信息,,必须以这样的格式进行
start_response("200 OK", [('Content-Type','text/html; charset=utf-8')])
函数的约定:返回body,必须是一个可迭代对象
return [html.encode()]

访问并调用开发者工具
找到请求头部信息
1.Request Headers view source1.Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.82.Accept-Encoding:gzip, deflate, br3.Accept-Language:zh-CN,zh;q=0.9,ja;q=0.8,en;q=0.74.Cache-Control:no-cache5.Connection:keep-alive6.Cookie:_ga=GA1.1.1906810342.14702095387.Host:127.0.0.1:99998.Pragma:no-cache9. 10. Upgrade-Insecure-Requests:111. User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
展开头部信息查看


选择view srouce

首先关注以下几个信息
GET / HTTP/1.1Host: 127.0.0.1:9999Connection: keep-alivePragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,ja;q=0.8,en;q=0.7Cookie: _ga=GA1.1.1906810342.1470209538
服务端environ返回如下
<class 'dict'> # environ 是一个字典127.0.0.1 - - [26/Dec/2017 17:08:51] "GET /favicon.ico HTTP/1.1" 200 1

思考:哪些是回调

首先server回调,传递两个参数 environ 、start_response 通过处理里面信息
头部和正文依次返回

回调必须是一个可调用对象
回调的参数
environ 存放各种头部信息response 回写函数,传递返回头部信息
最后执行
return [正文] 返回body
QUERY_STRING 查询字符串的解析
传递
id=5&name=xxx通过这样的方式可以进行获取:
qstr = environ.get('QUERY_STRING')这样可以自己去做处理,通过&符号进行断开

但是涉及到编码,一般编码涉及的是内容信息
用=号进行拆分
qstr = environ.get('QUERY_STRING')print(qstr,'-------------------------------------') if qstr: for pair in qstr.split('&'): k,_,v = pair.partition('=') print('k={},v={}'.format(k,v))
比如访问某个路径,通过拆分方式获取多个值: http://xxx.com/index.html?id=xxx&name=xxx只要发现有请求进来都会传递给application的
1.通过environ.get获取用户传递来的信息
略,看笔记

2.通过cgi模块,通过parse_qs进行处理
但是这个模块快过期了,官方建议用urllib,模块中注释中依然写明

3.通过urllib获取传递的查询信息
from wsgiref.simple_server import make_server, demo_appfrom urllib.parse import parse_qs,parse_qsl def app(environ:dict,start_response): qstr = environ.get('QUERY_STRING') #依次打印下面三条信息 print('qstr: ',qstr) print('parse_qs: ',parse_qs(qstr)) print('parse_qsl: ',parse_qsl(qstr)) html = '<h1>hi</h1>' start_response("200 OK", [('Content-Type','text/html; charset=utf-8')]) return [html.encode()] ip = '127.0.0.1'port = 9999 server = make_server(ip,port,app)server.serve_forever()server.server_close(
访问并传入查询语句http://127.0.0.1:9999/index.html?id=12&name=wang访问结果如下:
127.0.0.1 - - [26/Dec/2017 18:32:56] "GET /index.html?id=12&name=wang HTTP/1.1" 200 11qstr: id=12&name=wangparse_qs: {'name': ['wang'], 'id': ['12']}parse_qsl: [('id', '12'), ('name', 'wang')]
多条查询如下: http://127.0.0.1:9999/index.html?id=12&name=wang&name=chao 返回如下:
qstr: id=12&name=wang&name=chaoparse_qs: {'id': ['12'], 'name': ['wang', 'chao']}parse_qsl: [('id', '12'), ('name', 'wang'), ('name', 'chao')]127.0.0.1 - - [26/Dec/2017 18:37:50] "GET /index.html?id=12&name=wang&name=chao HTTP/1.1" 200 11
通过environ.get 获取QUERY_STRING 查询内容,并由用列表显示,列表中所有的数据都为一个二元组,
parse_qs : 返回一个字典,多关键字由一个key保存parse_qsl : 返回一个列表,将二元组的方式进行封装具体用哪个自行选型数据结构,主要决定后期如何传入并解析数据

以上是一个常用的传参方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wsgi
相关文章推荐