tornado.httputil — Manipulate HTTP headers and URLs

客户端和服务器共享的HTTP实用程序代码.

该模块还定义了HTTPServerRequest类,该类通过tornado.web.RequestHandler.request .

class tornado.httputil.HTTPHeaders(*args, **kwargs)[source]

维护所有键的Http-Header-Case字典.

通过一对新方法add()get_list()支持每个键多个值. 常规词典接口每个键返回一个值,多个值之间用逗号联接.

>>> h = HTTPHeaders({"content-type": "text/html"})
>>> list(h.keys())
['Content-Type']
>>> h["Content-Type"]
'text/html'
>>> h.add("Set-Cookie", "A=B")
>>> h.add("Set-Cookie", "C=D")
>>> h["set-cookie"]
'A=B,C=D'
>>> h.get_list("set-cookie")
['A=B', 'C=D']
>>> for (k,v) in sorted(h.get_all()):
...    print('%s: %s' % (k,v))
...
Content-Type: text/html
Set-Cookie: A=B
Set-Cookie: C=D
add(name: str, value: str) → None[source]

为给定键添加一个新值.

get_list(name: str) → List[str][source]

以列表形式返回给定标头的所有值.

get_all() → Iterable[Tuple[str, str]][source]

返回所有(名称,值)对的可迭代对象.

如果标头具有多个值,则将返回多个具有相同名称的对.

parse_line(line: str) → None[source]

用单个标题行更新字典.

>>> h = HTTPHeaders()
>>> h.parse_line("Content-Type: text/html")
>>> h.get('content-type')
'text/html'
classmethod parse(headers: str) → tornado.httputil.HTTPHeaders[source]

从HTTP标头文本返回字典.

>>> h = HTTPHeaders.parse("Content-Type: text/html\r\nContent-Length: 42\r\n")
>>> sorted(h.items())
[('Content-Length', '42'), ('Content-Type', 'text/html')]

改变在5.1版本:引发HTTPInputError的标题格式错误,而不是混合KeyError ,并ValueError .

class tornado.httputil.HTTPServerRequest(method: str = None, uri: str = None, version: str = 'HTTP/1.0', headers: tornado.httputil.HTTPHeaders = None, body: bytes = None, host: str = None, files: Dict[str, List[HTTPFile]] = None, connection: Optional[tornado.httputil.HTTPConnection] = None, start_line: Optional[tornado.httputil.RequestStartLine] = None, server_connection: object = None)[source]

单个HTTP请求.

除非另有说明,否则所有属性均为str类型.

method

HTTP请求方法,例如" GET"或" POST"

uri

要求的uri.

path

uri的路径部分

query

uri的查询部分

version

请求中指定的HTTP版本,例如" HTTP / 1.1"

headers

HTTPHeaders字典的对象,用于请求标头. 就像不区分大小写的字典一样,具有用于重复标题的其他方法.

body

请求正文(如果存在)为字节字符串.

remote_ip

客户端的IP地址(字符串). 如果设置了HTTPServer.xheaders ,它将在X-Real-IpX-Forwarded-For标头中传递负载平衡器提供的真实IP地址.

在版本3.1中更改:现在支持X-Forwarded-For的列表格式.

protocol

使用的协议为" http"或" https". 如果设置了HTTPServer.xheaders ,则通过X-Scheme标头报告时,将传递负载平衡器使用的协议.

host

请求的主机名,通常从Host标头中获取.

arguments

GET / POST参数在arguments属性中可用,该属性将参数名称映射到值列表(以支持单个名称的多个值). 名称为str类型,而参数为字节字符串. 请注意,这与RequestHandler.get_argument不同,后者将参数值作为Unicode字符串返回.

query_arguments

arguments相同的格式,但仅包含从查询字符串中提取的参数.

3.2版中的新功能.

body_arguments

arguments格式相同,但仅包含从请求正文中提取的参数.

3.2版中的新功能.

files

文件属性中提供了文件上传功能,该属性将文件名映射到HTTPFile列表.

connection

HTTP请求附加到单个HTTP连接,可以通过"连接"属性进行访问. 由于连接通常在HTTP / 1.1中保持打开状态,因此可以在单个连接上顺序处理多个请求.

在版本4.0中更改:tornado.httpserver.HTTPRequest .

property cookies

http.cookies.Morsel对象的字典.

full_url() → str[source]

重建此请求的完整URL.

request_time() → float[source]

返回执行此请求所花费的时间.

get_ssl_certificate(binary_form: bool = False) → Union[None, Dict, bytes][source]

返回客户端的SSL证书(如果有).

要使用客户端证书,必须设置HTTPServer的ssl.SSLContext.verify_mode字段,例如:

ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain("foo.crt", "foo.key")
ssl_ctx.load_verify_locations("cacerts.pem")
ssl_ctx.verify_mode = ssl.CERT_REQUIRED
server = HTTPServer(app, ssl_options=ssl_ctx)

默认情况下,返回值是字典(如果没有客户端证书,则返回None). 如果binary_form为true,则返回证书的DER编码形式. 有关更多详细信息,请参见标准库中的SSLSocket.getpeercert(). http://docs.python.org/library/ssl.html#sslsocket-objects

exception tornado.httputil.HTTPInputError[source]

异常类型的HTTP请求或来自远程源的响应的异常类.

版本4.0中的新功能.

exception tornado.httputil.HTTPOutputError[source]

HTTP输出错误的异常类.

版本4.0中的新功能.

class tornado.httputil.HTTPServerConnectionDelegate[source]

实现此接口以处理来自HTTPServer请求.

版本4.0中的新功能.

start_request(server_conn: object, request_conn: tornado.httputil.HTTPConnection) → tornado.httputil.HTTPMessageDelegate[source]

当新请求开始时,服务器将调用此方法.

Parameters
  • server_conn –是不透明的对象,表示寿命长(例如tcp级别)的连接.

  • request_conn –是用于单个请求/响应交换的HTTPConnection对象.

此方法应返回HTTPMessageDelegate .

on_close(server_conn: object) → None[source]

连接关闭后将调用此方法.

Parameters

server_conn –是先前已传递给start_request的服务器连接.

class tornado.httputil.HTTPMessageDelegate[source]

实现此接口以处理HTTP请求或响应.

版本4.0中的新功能.

headers_received(start_line: Union[RequestStartLine, ResponseStartLine], headers: tornado.httputil.HTTPHeaders) → Optional[Awaitable[None]][source]

在已接收并解析HTTP标头时调用.

Parameters

某些HTTPConnection方法只能在headers_received期间调用.

可能返回Future ; 如果这样做,则直到完成,才读取正文.

data_received(chunk: bytes) → Optional[Awaitable[None]][source]

收到大量数据时调用.

可能会返回Future以进行流量控制.

finish() → None[source]

在接收到最后一个数据块后调用.

on_connection_close() → None[source]

Called if the connection is closed without finishing the request.

如果调用headers_received ,则将调用finishon_connection_close ,但不能两者都调用.

class tornado.httputil.HTTPConnection[source]

应用程序使用此接口来编写其响应.

版本4.0中的新功能.

write_headers(start_line: Union[RequestStartLine, ResponseStartLine], headers: tornado.httputil.HTTPHeaders, chunk: bytes = None) → Future[None][source]

编写一个HTTP标头块.

Parameters

start_lineversion字段将被忽略.

返回流量控制的未来.

在版本6.0中更改: callback参数已删除.

write(chunk: bytes) → Future[None][source]

写入大量的主体数据.

返回流量控制的未来.

在版本6.0中更改: callback参数已删除.

finish() → None[source]

表示最后的主体数据已被写入.

tornado.httputil.url_concat(url: str, args: Union[None, Dict[str, str], List[Tuple[str, str]], Tuple[Tuple[str, str], ...]]) → str[source]

串联url和参数,而不管url是否具有现有的查询参数.

args可以是字典,也可以是键值对列表(后者允许使用同一键的多个值).

>>> url_concat("http://example.com/foo", dict(c="d"))
'http://example.com/foo?c=d'
>>> url_concat("http://example.com/foo?a=b", dict(c="d"))
'http://example.com/foo?a=b&c=d'
>>> url_concat("http://example.com/foo?a=b", [("c", "d"), ("c", "d2")])
'http://example.com/foo?a=b&c=d&c=d2'
class tornado.httputil.HTTPFile[source]

表示通过表单上传的文件.

为了向后兼容,还可以将其实例属性作为字典键进行访问.

  • filename

  • body

  • content_type

tornado.httputil.parse_body_arguments(content_type: str, body: bytes, arguments: Dict[str, List[bytes]], files: Dict[str, List[tornado.httputil.HTTPFile]], headers: tornado.httputil.HTTPHeaders = None) → None[source]

Parses a form request body.

支持application/x-www-form-urlencodedmultipart/form-data . content_type参数应为字符串, body应为字节字符串. argumentsfiles参数是字典,将使用已解析的内容进行更新.

tornado.httputil.parse_multipart_form_data(boundary: bytes, data: bytes, arguments: Dict[str, List[bytes]], files: Dict[str, List[tornado.httputil.HTTPFile]]) → None[source]

解析multipart/form-data主体.

boundarydata参数都是字节字符串. 参数和文件参数中给出的词典将使用正文内容进行更新.

在版本5.1中更改:现在可以识别RFC 2231/5987( filename*= )格式的非ASCII文件filename*= .

tornado.httputil.format_timestamp(ts: Union[int, float, tuple, time.struct_time, datetime.datetime]) → str[source]

以HTTP使用的格式格式化时间戳.

该参数可以是time.time返回的数字时间戳, time.gmtime返回的时间元组或datetime.datetime对象.

>>> format_timestamp(1359312200)
'Sun, 27 Jan 2013 18:43:20 GMT'
class tornado.httputil.RequestStartLine

RequestStartLine(方法,路径,版本)

创建RequestStartLine的新实例(方法,路径,版本)

property method

字段编号0的别名

property path

字段编号1的别名

property version

字段2的别名

tornado.httputil.parse_request_start_line(line: str) → tornado.httputil.RequestStartLine[source]

返回HTTP 1.x请求行的(方法,路径,版本)元组.

响应是一个collections.namedtuple .

>>> parse_request_start_line("GET /foo HTTP/1.1")
RequestStartLine(method='GET', path='/foo', version='HTTP/1.1')
class tornado.httputil.ResponseStartLine

ResponseStartLine(版本,代码,原因)

创建ResponseStartLine的新实例(版本,代码,原因)

property code

字段编号1的别名

property reason

字段2的别名

property version

字段编号0的别名

tornado.httputil.parse_response_start_line(line: str) → tornado.httputil.ResponseStartLine[source]

返回HTTP 1.x响应行的(版本,代码,原因)元组.

响应是一个collections.namedtuple .

>>> parse_response_start_line("HTTP/1.1 200 OK")
ResponseStartLine(version='HTTP/1.1', code=200, reason='OK')
tornado.httputil.encode_username_password(username: Union[str, bytes], password: Union[str, bytes]) → bytes[source]

以HTTP身份验证使用的格式对用户名/密码对进行编码.

返回值是一个字节字符串,格式为username:password .

5.1版中的新功能.

tornado.httputil.split_host_and_port(netloc: str) → Tuple[str, Optional[int]][source]

netloc返回(host, port)元组.

如果不存在,返回的port将为" None .

4.1版中的新功能.

tornado.httputil.qs_to_qsl(qs: Dict[str, List[AnyStr]]) → Iterable[Tuple[str, AnyStr]][source]

生成器将parse_qs的结果转换回名称-值对.

5.0版中的新功能.

Cookie HTTP标头解析为名称/值对的字典.

该函数试图模仿浏览器cookie的解析行为; 它专门不遵循任何与Cookie相关的RFC(因为浏览器也不遵循).

The algorithm used is identical to that used by Django version 1.9.10.

版本4.4.2中的新功能.