2015-01-20 70 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