2015-01-20 3 views
8

Я использую Flask, чтобы создать пару очень простых сервисов. Из внешнего тестирования (используя HTTPIE) параметры через querystring получают доступ к сервису.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 прокомментировал 24 июля 2013 г.
Это в настоящее время предназначенное поведение. Первым параметром тестового клиента должен быть относительный 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 
Смежные вопросы