Flask test_client删除查询字符串参数
问题描述:
我正在使用Flask来创建几个非常简单的服务。从外部测试(使用HTTPie)到查询字符串的参数正在进入服务。Flask test_client删除查询字符串参数
但是,如果我使用类似的东西。
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
实际上是空的。
self.client
通过在我配置的Flask应用程序上调用app.test_client()
来创建。
任何人都有任何想法为什么?
之后的任何东西被扔掉或如何解决它,而仍然使用test_client
?
答
我刚刚发现了一个解决方法。
让
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所提供的查询字符串被丢弃的地方... 。
但无论如何,这个作品的时刻。
答
我知道这是一个旧帖子,但我也遇到过这个。在烧瓶github repository有一个关于这个问题的公开问题。看来这是预期的行为。从发布主题回复:
mitsuhiko评论于2013年7月24日
这是目前的预期行为。测试客户端的第一个参数应该是相对url。如果不是,那么参数将被删除,因为它被视为与第二个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