我正在使用Flask创建一些非常简单的服务。从外部测试(使用HTTPie)参数通过查询字符串进入服务。
但如果我使用类似的东西。
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¶m2=somevalue2
当我断断续续进入服务时:
request.args
实际上是空的。
通过在我配置的Flask应用程序上调用self.client
来创建 app.test_client()
。
任何人都知道为什么?
之后的任何内容被丢弃或者在使用test_client
时如何解决这个问题?
答案 0 :(得分:19)
我刚发现了一种解决方法。
请
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中提供的查询字符串被丢弃....
但无论如何这暂时适用。
答案 1 :(得分:0)
我知道这是一个老帖子,但我也遇到了这个问题。烧瓶github repository中存在一个未解决的问题。看来这是预期的行为。来自问题主题的回复:
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'
将绝对网址转换为相对网址并保留查询字符串的一种方法是使用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
答案 2 :(得分:0)
对我来说,解决方案是在with
语句中使用客户端:
with app.app_context():
with app.test_request_context():
with app.test_client() as client:
client.get(...)
代替
client = app.test_client()
client.get(...)
我将测试客户端的创建放在一个固定装置中,以便为每个测试方法“自动”创建它:
from my_back_end import MyBackEnd
sut = None
app = None
client = None
@pytest.fixture(autouse=True)
def before_each():
global sut, app, client
sut = MyBackEnd()
app = sut.create_application('frontEndPathMock')
with app.app_context():
with app.test_request_context():
with app.test_client() as client:
yield
答案 3 :(得分:0)
如果您正在尝试除 GET 之外的任何其他 HTTP 方法
response = self.client.patch(url_for("api.my-service"), query_string=data,
data="{}")
data="{}"
或 data=json.dumps({})
应该在那里,即使正文中没有内容。否则,将导致 BAD 请求。