Python3.6学习笔记(六)

简介: WSGI Python Web Server Gateway Interface 规范学习由于Python的灵活性,提供了多种方式可以作为服务端语言,包括Python编写的服务器(Medusa)、Python处理模块(mod_python),或者使用CGI、FastCGI方式触发Python脚本。

WSGI Python Web Server Gateway Interface 规范学习

由于Python的灵活性,提供了多种方式可以作为服务端语言,包括Python编写的服务器(Medusa)、Python处理模块(mod_python),或者使用CGI、FastCGI方式触发Python脚本。 为了能够编写更通用的Web端程序,提出了WSGI接口作为标准接口规范,类似于Java中的Serverlet,一旦编写完成后,可以运行在不同的App框架中。

WSGI接口涉及两个方面:一面是:服务器(server)或网关(gateway),相对别一面是:应用程序(application)或框架(framework)。服务端运行由应用程或框架提供的可执行的对像实例,至于这个可执行对象的是如果获得的细节,不在WSGI规范定义之内,而是同server或gataway去处理。

Application/Framework 端

Application端是一个callable term,可以是function、class、method等,接收两个参数environ、start_response。当application被server调用时,必须返回一个iterable的bytestrings或者是zero(可以使用yield返回一个生成器)。

WSGI 是为框架或服务器开发人员提供的工具,而不是为应用人员提供的。

When called by the server, the application object must return an iterable yielding zero or more byte strings.

服务器调用时,应当以无缓存的形式将产生的内容发送给客户端。

方法:len()、close()

Server/Gateway 端

中间件 Middleware 扮演两个角色

Middleware常扮演以下角色:

  • 根据目标URL将请求路由到不同的Application进行处理
  • 允许多个Application或Framework运行在相同的进程中
  • 通过网络内的请求转发实现负载均衡和远程处理
  • 实现内容的后续处理,例如XSL样式表

中间件的存在对于服务端和应用端应该都是透明的。

environ 变量

environ 是一个字典变量。

变量名 备注
REQUEST_METHOD HTTP请求方法,GET、POST、PUT,不能为空
SCRIPT_NAME 脚本名称,可以为空
PATH_INFO 请求URL中的一部分,可以为空
QUERY_STRING 请求URL中问号(?)之后的部分,可以为空
CONTENT_TYPE 请求中的Content_Type字段,可以为空
CONTENT_LENGTH 请求中的Content_Length,可以为空
SERVER_NAME , SERVER_PORT 不能为空
SERVER_PROTOCOL 客户端发送请求采用的协议及版本
HTTP_ 变量 客户端请求头中的参数,可以为空

CGI方式需要提供的参数略有不同,具体可以参考PEP3333

A WSGI-compliant server or gateway should document what variables it provides, along with their definitions as appropriate. Applications should check for the presence of any variables they require, and have a fallback plan in the event such a variable is absent.

Input、Error流

服务器端必须支持以下几个方法

方法
read(size) Input
readline() Input
readlines(hint) Input
iter() Input
flush() errors
write(str) errors
writelines(seq) errors

start_response()

方法示例start_response(status, response_headers, exec_info = None)

start_response 接收两个参数start_response(status, response_headers),status是状态返回信息,诸如“200 OK”或者“404 Not Found”,纯文本,不能包含任何控制符号。response_headers是一个形如(header_name, header_value)的tuples,必须是Python的List。header_name必须是RFC2616中定义的名称,header_value不包含结束符号及任何控制符号,包括换行等。

一般来说,服务器端负责确保发送的header的正确性,如果应用忽略了某个http头参数,那么服务器应该给补充进去。

服务端应该检查是否向客户端发送了保持链接的头参数,如果发现,应该抛出错误。

Content-Length 头的处理

如果应用端提供了 Content-Length 请求头,服务端不应当传递超过这个长度的内容。处理方式是停止发送内容,或产生一个报错。如果没有提供足够的内容,则应正常关闭链接不产生错误。

如果没有提供 Content-Length 头,则服务端可以自己决定采用哪种处理方式,最简单的就是响应结束后关闭链接。某些情况下,服务端可以自己产生 Content-Length , 或者尽量避免关闭链接。如果服务端和客户端都支持 HTTP/1.1 分块编码,则服务端需要为每个块提供一个 Content-Length。

缓存和流处理 Buffering and Streaming

write() callable

一些编程框架提供了缓存的 write() 函数以及一个 flush() 函数,用于刷新缓存,但是很遗憾标准的WSGI无法实现这个需求。但WSGI仍提供了一个特殊 write() 函数,来实现这些迫切的需求。

write() 由 start_response 返回,接收一个参数。一个应用必须返回一个 iterable 对象。

错误处理

相关文章
|
1月前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
227 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
1月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
139 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
1月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
149 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
1月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
64 1
|
1月前
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
86 1
|
1月前
|
索引 Python
Python学习笔记编程小哥令狐~持续更新、、、(上)
Python学习笔记编程小哥令狐~持续更新、、、(上)
51 2
|
1月前
|
存储 Python
Python学习笔记编程小哥令狐~持续更新、、、 (下)
Python学习笔记编程小哥令狐~持续更新、、、 (下)
33 1
|
1月前
|
存储 Python
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
42 0
【免费分享编程笔记】Python学习笔记(二)
|
1月前
|
Java 编译器 Go
Python学习笔记--- day01计算机基础和环境搭建(一)
Python学习笔记--- day01计算机基础和环境搭建(一)
|
1月前
|
程序员 编译器 Python
Python学习笔记--- day01计算机基础和环境搭建(二)
Python学习笔记--- day01计算机基础和环境搭建(二)
下一篇
无影云桌面