Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Tornado中将内容长度头从服务器写入客户端_Python_Http_Http Headers_Tornado - Fatal编程技术网

Python 在Tornado中将内容长度头从服务器写入客户端

Python 在Tornado中将内容长度头从服务器写入客户端,python,http,http-headers,tornado,Python,Http,Http Headers,Tornado,我有一个tornado服务器,它只打印客户端发送的头文件。 server.py: import tornado.httpserver import tornado.ioloop import tornado.httputil as hutil def handle_request(request): message = "" try : message = request.headers['Content-Length'] except Key

我有一个tornado服务器,它只打印客户端发送的头文件。 server.py:

import tornado.httpserver
import tornado.ioloop
import tornado.httputil as hutil

def handle_request(request):

    message = ""
    try :
            message = request.headers['Content-Length']
    except KeyError :
            message = request.headers
    request.connection.write_headers(
            tornado.httputil.ResponseStartLine('HTTP/1.1', 200, 'OK'),
            tornado.httputil.HTTPHeaders
            ({"Content-Length": str(len(message))}))
    request.connection.finish()
    print(request.headers)

http_server = tornado.httpserver.HTTPServer(handle_request)
http_server.listen(8888, address='127.0.0.1')
tornado.ioloop.IOLoop.instance().start()
当我使用curl向这个服务器发送请求时,我得到以下回溯

ERROR:tornado.application:Uncaught exception
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado/http1connection.py", line 234, in _read_message
    delegate.finish()
  File "/usr/local/lib/python2.7/dist-packages/tornado/httpserver.py", line 280, in finish
    self.server.request_callback(self.request)
  File "Tests/tornado_server.py", line 17, in handle_request
    request.connection.finish()
  File "/usr/local/lib/python2.7/dist-packages/tornado/http1connection.py", line 430, in finish
    self._expected_content_remaining)
HTTPOutputError: Tried to write 5 bytes less than Content-Length
我从Curl发送的标题:

{'Host': '127.0.0.1:8888', 'Accept': '*/*', 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36'}
是否有必要写回与内容长度相同的数据量?如果是这样的话,为什么要这样做?应该如何做?
提前感谢。

您需要写回与您所说的相同的字节数。您为响应返回了
内容长度
标题。这意味着您的响应体需要包含这么多字节

从表面上看,你没有写任何回应体的回复;如果您声明正在发送
len(str(message))
bytes,那么您可能也想发送
str(message)

request.connection.write(str(message))

这与请求中的
内容长度
不同,后者表示请求正文包含的字节数。

谢谢!还有另一个错误,标题应该是{“Content Length”:str(len(str(message))}@Sentient07:对,我对Tornado不太熟悉;如果
HTTPHeaders
对象没有自动将值转换为字符串,那么确实需要显式地进行转换。还要注意的是,在大多数情况下,Tornado会为您设置内容长度,因此您不必自己设置。如果要对响应进行流式处理(即调用self.flush()),并且希望客户端知道下载量有多大,而不是使用分块编码,则只需显式设置内容长度。