Flask test_客户端删除查询字符串参数

2024-05-20 13:36:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Flask创建一些非常简单的服务。从外部测试(使用HTTPie)参数通过querystring到达服务。

但如果我用的是类似的东西。

    data = {
        'param1': 'somevalue1',
        'param2': 'somevalue2'}

    response = self.client.get(url_for("api.my-service", **data))

我可以看到正在创建的正确URI:

http://localhost:5000/api1.0/my-service?param1=somevalue1&param2=somevalue2

当我中断到服务时:

request.args

实际上是空的。

通过在我配置的烧瓶应用程序上调用app.test_client()创建self.client

有人知道为什么?之后的东西会被扔掉,或者在使用test_client时如何处理?


Tags: testselfclientflaskdata参数responsemy
2条回答

我知道这是一个老职位,但我也遇到了这个。烧瓶里有一个公开的问题。看来这是故意的行为。从问题线程中的响应:

mitsuhiko于2013年7月24日发表评论
这是目前的预期行为。测试客户端的第一个参数应该是一个相对的url。如果不是,那么参数将被删除,因为它被视为与第二个连接的url。有效:

>>> from flask import Flask, request
>>> app = Flask(__name__)
>>> app.testing = True
>>> @app.route('/')
... def index():
...  return request.url
... 
>>> c = app.test_client()
>>> c.get('/?foo=bar').data
'http://localhost/?foo=bar'

将绝对url转换为相对url并保留查询字符串的一种方法是使用urlparse:

from urlparse import urlparse

absolute_url = "http://someurl.com/path/to/endpoint?q=test"
parsed = urlparse(absolute_url)
path = parsed[2] or "/"
query = parsed[4]
relative_url = "{}?{}".format(path, query)

print relative_url

我刚找到一个解决办法。

制造

data = {
    'param1': 'somevalue1',
    'param2': 'somevalue2'}

response = self.client.get(url_for("api.my-service", **data))

进入这个:

data = {
    'param1': 'somevalue1',
    'param2': 'somevalue2'}

response = self.client.get(url_for("api.my-service"), query_string = data)

这是可行的,但似乎有点不直观,并且在某个地方调试时,URI中提供的查询字符串会被丢弃。。。。

但不管怎么说,这暂时有效。

相关问题 更多 >