Tornado:使用 AsyncHTTPTestCase 测试多部分请求

2024-04-19

我正在编写一个使用多部分请求的用户上传文件的 API。我看到Tornado 4.5版本已经支持多部分请求。但在那之后,我想测试这个API。

我的问题是:

  • 如何在 Tornado 上测试多部分请求。我在谷歌上搜索了很多参考资料,但找不到有用的资源。
  • 如果无法在 Tornado 中执行此操作,我如何提出多部分请求,以便可以与 Tornado 的 AsyncHTTPTestCase 一起使用。

Thanks


Tornado 没有内置支持发出多部分请求。你会 必须手动提交多部分请求。

我们先来看看如何multipart/form-data请求看起来像。

样本表格:

<form method="POST" enctype="multipart/form-data">
    <input type="text" name="field1">
    <input type="file" name="field2">

    <input type="submit">
</form>

如果您输入Hello in field1并选择一个名为myfile.png for field2, HTTP 请求将如下所示:

POST /url HTTP/1.1
Content-Type: multipart/form-data; boundary="boundary"

--boundary
Content-Disposition: form-data; name="field1"

Hello
--boundary
Content-Disposition: form-data; name="field2"; filename="myfile.png"
Conent-Type: image/png

<binary content of myfile.png>
--boundary--

您所要做的就是编译一个类似的请求。


在向您展示示例之前,让我先向您澄清一些事情, 如果您还不知道 - 在上面的原始 HTTP 请求示例中,最后 每行都有这些字符 -\r\n。他们在这里不可见,但是 它们存在于实际的 HTTP 请求中。连空白行都有\r\n出现的人物。

了解这一点很重要。如果您要手动编译 HTTP 请求,您将 必须添加\r\n每行末尾的字符。

让我们来看这个例子。

class MyTestCase(AsyncHTTPTestCase):
    def test_something(self):
        # create a boundary
        boundary = 'SomeRandomBoundary'

        # set the Content-Type header
        headers = {
            'Content-Type': 'multipart/form-data; boundary=%s' % boundary
        }

        # create the body

        # opening boundary
        body = '--%s\r\n' % boundary 

        # data for field1
        body += 'Content-Disposition: form-data; name="field1"\r\n'
        body += '\r\n' # blank line
        body += 'Hello\r\n'

        # separator boundary
        body += '--%s\r\n' % boundary 

        # data for field2
        body += 'Content-Disposition: form-data; name="field2"; filename="myfile.png"\r\n'
        body += '\r\n' # blank line
        # now read myfile.png and add that data to the body
        with open('myfile.png', 'rb') as f:
            body += '%s\r\n' % f.read()

        # the closing boundary
        body += "--%s--\r\n" % boundary


        # make a request
        self.fetch(url, method='POST', headers=headers, body=body)

上面的代码是非常基本的。如果您有多个文件和参数,您应该 考虑为此编写一个单独的函数并利用for loops. 点击这里 https://github.com/tornadoweb/tornado/blob/master/demos/file_upload/file_uploader.py#L29-L71来自 Tornado 的 github 存储库的示例代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tornado:使用 AsyncHTTPTestCase 测试多部分请求 的相关文章

随机推荐