2015-01-20 8 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은 내 구성 플라스크 응용 프로그램에서 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 님이 2012 년 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 
관련 문제