2015-01-20 34 views
8

我正在使用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&param2=somevalue2 

当我断点到服务:

request.args 

实际上是空的。

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

任何人都有任何想法为什么?之后的任何东西被扔掉或如何解决它,而仍然使用test_client

回答

11

我刚刚发现了一个解决方法。

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所提供的查询字符串被丢弃的地方... 。

但无论如何,这个作品的时刻。

0

我知道这是一个旧帖子,但我也遇到过这个。在烧瓶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