当前位置: 首页 > Web前端 > HTML5

通读wsgiref官方Python文档(未完成)

时间:2023-04-05 13:01:17 HTML5

wsgirf-WSGI功能及参考实现源码:lib/wsgirefWeb服务器网关接口(WebServerGatewayInterface,WSGI),用Python编写的介于服务器软件和Web应用程序之间通用接口。使用通用接口可以使不同的Web服务器方便地调用相同的应用程序。只有Web服务器和软件框架的作者需要了解WSGI设计的细节和极端情况。您只需要安装一个WSGI应用程序或者使用现有的框架编写一个Web应用程序,您不需要了解WSGI的所有细节。wsgiref是WSGI规范的参考实现,用于为Web服务器和框架提供WSGI支持。它提供了处理WSGI环境变量、响应标头和WSGI服务器基类的功能,一个为WSGI应用程序提供服务的演示HTTP服务器,以及用于检查WSGI服务器和应用程序是否符合WSGI规范(PEP3333)的验证工具。前往wsgi官网获取更多信息和相关教程。wsgiref.util-WSGI环境实用程序该模块提供了WSGI环境的有用功能列表。根据PEP3333,WSGI环境是一个包含HTTP请求变量的字典。所有接受environ参数的函数都需要一个WSGI兼容的字典。有关详细信息,请参阅PEP3333。wsgiref.util.guess_scheme(environ)通过检查环境变量中的HTTPS返回wsgi.url_scheme是http还是https。该函数用于创建一个封装了CGI或FastCGI协议的网关。通常,提供这些协议的服务器在使用SSL时会提供值为“1”、“yes”或“on”的HTTPS变量。如果找到,此函数返回“https”;否则,返回'http'。wsgiref.util.request_uri(environ,include_query=True)返回请求的URI,可选参数决定是否返回查询字符串,使用PEP3333中的“URLReconstruction”算法。wsgiref.util.application_uri(environ)类似于request_uri方法,除了忽略PATH_INFO和QUERY_STRING变量。返回结果是发起请求的应用对象的基址(baseuri)。wsgiref.util.shift_pathi_info(environ)将名称从环境变量中的PAHT_INFO移动到SCRIPT_NAME并返回。环境变量会原地修改,如果要保留原值,请保存备份。如果PAHT_INFO中没有剩余路径段,则返回None。一般来说,这个例程用于处理请求URI的每一部分,比如作为一系列字典键的路径。此例程修改传递的环境变量以用于为目标URI激活WSGI应用程序。例如/foo路径上有WSGI应用,请求URI为/foo/bar/baz,/foo上的WSGI应用调用shift_path_info(),会得到“bar”,环境变量会进行更新,以便它传递给位于/foo/bar/的WSGI应用程序。也就是说,SCRIPT_NAME从/foo变为/foo/bar,PATH_INFO从/bar/baz变为/baz。当路径只是“/”时,例程返回空字符串并在SCRIPT_NAME处添加尾部斜杠。虽然空路径段一般会被忽略。但SCRIPT_NAME一般不以斜杠结尾。这是有意设计的,以便应用程序在进行对象遍历时可以区分/x和/x/这两个不同的路径。#源代码#https://github.com/python/cpython/blob/master/Lib/wsgiref/util.py#L102ifnotnameandnotscript_name.endswith('/'):script_name+='/'wsgiref.util.setup_testing_defaults(environ)更新测试环境变量。该例程向WSGI添加各种参数,包括HTTP_HOST、SERVER_NAME、SERVER_PORT、REQUESTS_METHOD、SCRIPT_NAME。以及PEP3333以上的所有wsgi.*变量。只提供默认值,不替换现有值。RationalCity旨在建立一个环境,使单元测试WSGI和应用程序更容易。不应在真正的WSGI服务器上使用,因为数据是假的。fromwsgiref.utilimportsetup_testing_defaultsfromwsgiref.simple_serverimportmake_server#一个相对简单的WSGI应用程序。setup_testing_defaultsdefsimple_app(environ,start_response)更新后,它将打印出#环境字典:charset=utf-8')]#发送报头start_response(status,headers)ret=[("%s:%s\n"%(key,value)).encode("utf-8")forkey,valueinenviron.items()]returnret#在3.6.1下运行这行代码会报错,make_server不支持上下文管理?#把with语句改成普通语句好像没问题。withmake_server('',8000,simple_app)ashttpd:print("Servingonport8000...")httpd.serve_forever()除上述功能外,wsgiref.util还提供了各种其他功能。根据[RFC2616](https://tools.ietf.org/html/rfc2616.html),如果header_name是“Hop-by-Hop”,wsgiref.util.is_hop_by_hop(header_name)返回True.wsgiref。util.FileWrapper(filelike,blksize=8192)将类文件对象转换为迭代器的包装器。结果支持__getitem__()和__iter__()。当迭代这个对象时,`blksize`参数将被重复传递给类文件对象的`read()`方法以获取结果字节。当read()产生空字节时迭代结束。如果此类文件对象有一个“close()”方法,则返回的对象也有一个“close()”方法,调用时会激活类文件对象的“close()”方法。fromioimportStringIOfromwsgiref.utilimportFileWrapper#我们使用StringIO缓冲区作为类文件对象filelike=StringIO("Thisisanexamplefile-likeobject"*10)wrapper=FileWrapper(filelike,blksize=5)forchunkinwrapper:print(chunk)wsgi.headersWSGIresponseheadertools该模块只提供一个类:Headers。使用(类映射接口)映射接口轻松操作WSGI响应头。wsgiref.headers.Headers([headers])类创建一个包装标题的地图对象。标头,必须是PEP3333中指定的键值元组列表。默认为空列表。】Headers对象支持映射操作,包括__getitem()、get()、__setitem()、setdefault()、__delitem()、__contain__()。键是名称,值是名称下的第一个值。与字典不同,当您尝试删除或获取不存在的键时,Headers对象不会抛出异常。Headers的长度等于其items()的长度,bytes()函数返回一个格式化的字符串,用于传输HTTP响应头。每个标题占一行,由冒号和控制开关分隔。行为期间回车+换行。末尾的空行get_all(name)返回相应名称下的所有值,按照它们在原始标头中的顺序,或者按照它们被添加到实例中的顺序。可能会重复。add_header(name,value,**_params)添加一个header,可以通过关键字参数添加MIME参数。参数名称中的下划线将转换为连字符。因为拼接在python标识符中是不合法的,但是在MIME参数中有很多拼接。wsgiref.simple_server一个简单的WSGIHTTP服务器该模块提供了一个基于http.server的简单HTTP服务器,可以为WSGI应用程序提供服务。每个服务器实例在给定的主机和端口上提供一个WSGI应用程序。如果你想在一个主机和一个端口上服务多个应用程序,你应该创建一个WSGI应用程序来解析PATH_INFO以确定应该为每个请求选择哪个应用程序。wsgiref.simple_server.make_server(host,port,app,server_class=WSGIServer,handle_class=WSGIRequestHandler)在指定的主机和端口上创建一个新的WSGI服务器,接受来自应用程序的连接。返回值是传入的server_class的一个实例。并且会使用handler_class来处理请求。app参数必须是PEP3333中定义的WSGI应用程序对象。wsgirfe.simple_server.demo_app(environ,start_response)这个函数是一个小而完整的WSGI程序,返回包含“Helloworld!”的文本页面。和环境变量k-v的值对。用于确认WSGI服务器可以处理WSGI程序。wsgiref.simple_server.WSGIServer(server_address,RequestsHandlerClass)类创建一个WSGISever实例,server_address应该是一个(host,port)元组,RequestHandlerClass应该是http.server.BasedHTTPRequestHandler的子类,用于处理请求。您不需要正式调用构造函数,因为make_server()函数会为您处理细节。WSGIServer是http.server.HTTPServer的子类,所以继承了它的方法,如:serve_forever()和handle_request()。WSGIServer还提供了一些WSGI特定的方法。例如:set_app(application)将一个可调用应用程序设置为接收请求的WSGI应用程序。get_app()返回当前设置的可调用应用程序。通常,您不会调用这些额外的方法。set_app()一般由make_server()调用,get_app()主要为requestshandler实例而存在。wsgiref.simple_server.WSGIRequestHandler(reqeust,client_address,server)类为给定请求(例如,套接字)、client_address((主机,端口)元组)服务器创建HTTP处理程序。您不需要直接创建此类的实例,它们将由WSGIServer对象按需创建。您可以创建此类的子类并将其作为handler_class参数传递给make_server()函数。下面是一些可能与子类相关的重写函数。get_environ()返回包含WSGI环境的字典。默认设置返回WSGIServer对象的base_environ字典属性,加上来自HTTP请求的各种标头。每次调用此方法都会返回一个新字典,其中包含PEP3333中指定的各种CGI环境变量。get_stderr()返回要用作wsgi.errors流的对象。默认设置返回sys.stderr。handle()处理HTTP请求。默认情况下,这是使用wsgiref.hanlder类创建处理程序实例并执行真正的WSGI应用程序接口。wsgirref.validateWSGIConsistencyChecker在创建新的WSGI应用程序对象、框架、服务器和中间件时,使用wsgiref.validate检查新代码是否有效是非常有用的。该模块提供创建WSGI应用对象的功能,使WSGI服务器和WSGI应用对象可以正常通信,并检查双方协议的一致性。请注意,此应用程序不保证完全符合PEP3333。如果此模块不报告错误,并不意味着它一定是正确的。但是,如果这个模块报错,就说明一定有错误。并非100%兼容。该模块基于PythonPaste。wsgiref.validate.validator(application)`包装应用程序并返回一个新的WSGI应用程序对象,返回的应用程序会将所有请求发送给原始应用程序。并检查应用程序和启动它的服务器是否遵循WSGI规则和RFC2616。任何检测到的不一致都会导致抛出AssertionError。但是,如何处理这些异常取决于服务器。例如wsgiref.simple_server等基于wsgiref.handlers的服务器会直接输出错误信息,并将traceback信息输出到sys.stderr或其他错误流中。此包装器还可以使用警告模块来指示有问题的行为,但不会完全违反PEP3333。除非被Python命令行选项或警告API禁用,否则这些消息将输出到sys.stderr。wsgirf.handlers服务器/网络管理器基类该模块提供用于配置WSGI服务器和网关的基类。这些基类处理与WSGI应用程序的大部分通信,只要它们被赋予类似CGI的环境、输入/输出和错误流。wsgiref.hanlder.CGIHandler类通过sys.stdin、sys.stdout、sys.stderr和os.environ调用CGI。当您想从CGI脚本运行WSGI程序时很有用。您可以使用CGIHandler().run(app)。该类是BaseCGIHandler的子类,设置wsgi.run()=True、wsgi.multithread=False、wsgi.multiprocess=True,并使用sys和os获取必要的CGI流和环境。(参见CGI部分和先决条件)wsgiref.handler.IISCGIHandler类在Microsoft的IIS服务器上激活CGIHandler。wsgiref.handlers.BaseCGIHandler()类类似于CGIHandler类。wsgiref.handlers.BaseHandler是一个抽象类。每个实例处理一个HTTP请求。虽然原则上你可以创建一个可以被多个请求使用的子类。外部只能调用一个方法。运行(应用程序)