2015-01-20 6 views
8

sorgu dizesi parametrelerini kaldırır. Dış testlerden (HTTPie kullanarak) parametrelerden querystring ile servise gidiyoruz.Matara test_client Ben çok basit hizmetlerin bir çift oluşturmak için Flask kullanıyorum

Ama böyle bir şey kullanıyorum eğer.

data = { 
     'param1': 'somevalue1', 
     'param2': 'somevalue2'} 

    response = self.client.get(url_for("api.my-service", **data)) 

Doğru URI yaratılan görebilirsiniz:

http://localhost:5000/api1.0/my-service?param1=somevalue1&param2=somevalue2 

ben hizmete çalışma noktasının:

request.args 

aslında boştur.

self.client

benim yapılandırılmış Matara uygulamaya app.test_client() arayarak oluşturulur.

?'dan sonra neden bir şey fırlatıldığını veya hala test_client'u kullanırken etrafta nasıl çalışacağını bilen herhangi bir fikri olan var mı?

cevap

11

Sadece geçici bir çözüm öğrendim.

bu işe

data = { 
    'param1': 'somevalue1', 
    'param2': 'somevalue2'} 

response = self.client.get(url_for("api.my-service", **data)) 

olun:

data = { 
    'param1': 'somevalue1', 
    'param2': 'somevalue2'} 

response = self.client.get(url_for("api.my-service"), query_string = data) 

Bu işler ama biraz unintuitive görünüyor ve orada ayıklama URI sağlanan sorgu dizesi atılır bir yerdir ... .

Ama yine de bu an için çalışır

.

0

Bu eski bir yazı olduğunu biliyorum, ama ben de bu karşılaştım. Bu konuda github repository şişesinde açık bir sorun var. Görünüşe göre bu davranış niyetidir. Konuyla ilgili bir yanıttan:

mitsuhiko, 24 Tem 2013 tarihinde yorum yaptı.
Bu şu anda amaçlanan bir davranıştır. Test müşterisinin ilk parametresi göreli bir url olmalıdır. Değilse, parametreler, ikinci ile birleştirilen URL gibi işlendikçe kaldırılır. Bu çalışır:

>>> 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' 

Tek yön göreceli url içine mutlak url dönüştürmek ve sorgu dizesi urlparse kullanmaktır tutmak için:

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