【问题标题】:Flask test_client: Testing DELETE request with dataFlask test_client:使用数据测试 DELETE 请求
【发布时间】:2014-07-27 05:33:17
【问题描述】:

我正在尝试使用来自 http://flask.pocoo.org/docs/testing/ 的建议来测试我的 Flask 应用程序,但我不知道如何使用表单数据测试 DELETE 方法。

我的删除方法如下所示:

from flask.ext.restful import Resource, reqparse 
...
def delete(self):
    self.reqparse.add_argument('arg1', type=str, required=True, location='form')
    args = self.reqparse.parse_args()
    ...

我想测试一下:

def setUp(self):
    self.app = myApp.app.test_client()

def test_delete(self):
    rv = self.app.delete('MyEndPoint', data={'arg1', 'val'})

但它不起作用。我还在 werkzeug.test 中查看了 EnvironBuilder 的源代码,但仍然不知道如何传入数据。

【问题讨论】:

  • 您使用的是.delete('/url/where/my/endpoint/is/mounted', data={}) 还是.delete('name.of.my.endpoint', data={})?因为前者是你想要的(EnvironBuilder 的第一个参数是一个 URL)。
  • 我只使用了名字,但我不认为这是错误的。请参阅link 中的示例。此外,响应显示我正在访问正确的位置。只是我没有正确传入数据。

标签: python unit-testing flask werkzeug


【解决方案1】:

我刚遇到同样的问题,这基本上是因为Werkzeug的测试方法目前不支持设置DELETE请求的content_type

代码here 显示了 Werkzeug 如何获取内容类型:

def _get_content_type(self):
    ct = self.headers.get('Content-Type')
    if ct is None and not self._input_stream:
        if self.method in ('POST', 'PUT', 'PATCH'):
            if self._files:
                return 'multipart/form-data'
            return 'application/x-www-form-urlencoded'
        return None
    return ct

如果没有content_type,那么表单数据永远不会离开environ 并进入请求,因此您的 Flask 服务器实际上不会收到数据。

最终,这是 Werkzeug 的一个错误,因为您可以制作一个使用 DELETE 方法并且还包含表单数据的 curl 请求。我已经向 Werkzeug repo 提交了一个拉取请求来解决这个问题。欢迎在 github 上留言:https://github.com/mitsuhiko/werkzeug/pull/620

更新:要同时真正解决您的问题,您可以通过在请求中明确说明内容类型来解决此问题,如下所示:

def test_delete(self):
    rv = self.app.delete('MyEndPoint',
                         data={'arg1', 'val'},
                         headers={'Content-Type': 'application/x-www-form-urlencoded'})

再次更新:我提交的拉取请求已经过审核、改进和合并,并将包含在 Werkzeug 的 0.10 版本中,因此希望这不再是问题:)

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多