🌼WSGI概述和APP端开发
图片来自:Python Web开发基础-学习中心-阿里云开发者社区 (aliyun.com)
上图是python中的一种协议,图中的操作顺序是从上往下(我第一次仔细看这种图,之前真不知道)。
WSGI解决了Server和app之间的协议问题。在WSGI中,Server主要是理解HTTP,而请求中的数据应该如何处理不是Server能够决定的,应该由app的编程者来决定如何处理。
任何Web框架,都是客户端有一个请求,就应该得到一个响应。至于响应是被套了多少层最后传过来的,并不重要。响应应该包含响应头和正文两部分,
- 响应头:应该由app自己发送。Server在调用app的时候,会提供一个方法,比如叫做
start_response
,然后app调用这个由Server提供的方法来发送响应头。 - 正文:还是由Server发送
至于为什么要设计成响应头由app发送,我现在还不知道耶。
WSGI服务——wsgiref
wsgiref
是python中实现的一个参考库,并不用于商业开发,而是供你自己玩玩(学习使用),你可以在python的相关文档中找到关于它的介绍。
接下来是实操尝试,我们将以本机为服务器,建立一个WSGI服务,并在浏览器中访问它,对它发送http请求。
程序代码:
from wsgiref.simple_server import make_server
def simple_app(environ:dict, start_response):
# setup_testing_defaults(environ)
print('len:', len(environ))
for k, v in environ.items():
print(k, v)
print('-'*30)
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
start_response(status, headers)
ret = [("%s: %s\n" % (key, value)).encode("utf-8")
for key, value in environ.items()]
ret = ['Good good study, day day up!\n\n'.encode('utf-8')] + ret
return ret # 报文的正文部分,即网页内容
with make_server('0.0.0.0', 9000, simple_app) as httpd:
print("Serving on port 9000...")
try:
httpd.serve_forever()
except Exception as e:
print(e)
except KeyboardInterrupt:
print('stop')
httpd.server_close()
我们首先在python编辑器中写下这段代码,然后运行它。此时,我们的电脑本机就是一个持续运行的WSGI服务,随时准备接收来自客户端(浏览器)的http请求,并产生响应。
运行后,在python终端将显示:
Serving on port 9000...
然后我们在浏览器上输入地址:
http://127.0.0.1:9000/
在浏览器上显示为:
同时在python后台也会将environ打印出来:
environ:
-
是包含 Http 请求信息的 dict 对象
-
常见的名称及含义
名称 含义 REQUEST_METHOD 请求方法,GET、POST 等 PATH_INFO URL 中的路径部分 QUERY_STRING 查询字符串 SERVER_NAME, SERVER_PORT 服务器名、端口 HTTP_HOST 地址和端口 SERVER_PROTOCOL 协议 HTTP_USER_AGENT UserAgent 信息
WSGI APP应用程序端
make_server('0.0.0.0', 9000, simple_app)
中的simple_app
就是所谓的应用程序,需要满足三个条件:
-
应用程序应该是一个可调用的对象
-
这个可调用的对象应该接收两个参数
environ
和start_response
-
必须返回一个可迭代对象
-
应用程序可以是函数实现,也可以是类。如果使用类实现有两种方式:
# 类实现 - 1 class Application: def _init_(self, environ, start_response): ... def _iter_(self): yield res_str # 类实现 - 2 class Application: def _call_(self, environ, start_response): ... return [res_str]
-
Bug记录
我一开始以为是时代变迁,版本不一样所以我出bug了。后面继续看教程发现老师也出了这个bug,还是我心急了一点,没继续往下看就开始自己捣鼓了。
bug: not enough values to unpack
报错:ValueError: not enough values to unpack (expected 2, got 1)
复现代码:
d = {'a':1, 'b':2, 'c':3}
for k, v in d:
print(k, v)
修改:
d = {'a':1, 'b':2, 'c':3}
for k, v in d.items():
print(k, v)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114760.html