2015-01-20 9 views
8

Ich benutze Flask, um ein paar sehr einfache Dienste zu erstellen. Von außen testen (mit HTTPie) Parameter durch Querystring gelangen zum Service.Flask test_client entfernt Abfrage String Parameter

Aber wenn ich etwas benutze wie.

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

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

Ich kann die korrekte URI sehen erstellt werden:

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

, wenn ich in den Dienst Stopp-:

request.args 

tatsächlich leer ist.

self.client wird erstellt, indem auf meiner konfigurierten Flask-Anwendung aufgerufen wird.

Hat jemand eine Idee, warum etwas nach ? weggeworfen wird oder wie man es umgeht, während man immer noch test_client benutzt?

Antwort

11

Ich habe gerade eine Problemumgehung gefunden.

Machen

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

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

in dieser:

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

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

Das funktioniert aber scheint ein wenig intuitiv, und es Debuggen ist ein Ort, an dem der bereitgestellte Abfrage-String in den URI weggeworfen ...

Aber trotzdem funktioniert das für den Moment.

0

Ich weiß, das ist eine alte Post, aber ich lief auch in diese. Es gibt ein offenes Problem darüber in der Flasche github repository. Es scheint, dass dies ein beabsichtigtes Verhalten ist. Von einer Antwort in der Ausgabe Thread:

mitsuhiko kommentierte am 24. Juli 2013 Das ist derzeit beabsichtigt Verhalten. Der erste Parameter für den Testclient sollte eine relative URL sein. Wenn dies nicht der Fall ist, werden die Parameter entfernt, da sie so behandelt werden, als wäre sie mit der zweiten URL verknüpft. Dies funktioniert:

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

Eine Möglichkeit, Ihre absolute URL in eine relative URL zu konvertieren und die Query-String zu halten ist urlparse zu verwenden:

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 
Verwandte Themen