Как объединить Flask-RESTPlus с запросами: HTTP для людей? - PullRequest
0 голосов
/ 24 марта 2019

Я использую Flask-RESTPlus для создания конечной точки и использую Запросы: HTTP для людей для получения сведений о продукте с одного из сайтов электронной коммерции.

Я получил подробную информацию о продукте, используя Запросы , но когда я комбинирую его с FLASK-RESTPlus , я сталкиваюсь с некоторыми проблемами.

Вот фрагмент кода:

@api.route('/product')
class ProductDetails(Resource):
    query_parser = api.parser()
    query_parser.add_argument('marketplace', required=True, location='args')

    def post(self, query_parser=query_parser):
        args = query_parser.parse_args()
        url = args['marketplace']

        try:
            response = requests.post(
                url=args,
                json={
                     'url': url
                }, timeout=60
           )
            }
        except Exception as e:
           return {
                'status': 'error',
                'message': str(e)
            }

Когда я пытаюсь получить доступ к конечной точке

http://localhost:5000/api/v1/product?marketplace=http://xx.xx.xx.xx/v1/markeplace_name/url

я всегда получаю эту ошибку:

{
    "status": "error",
    "message": "No connection adapters were found for '{'marketplace': 'http://xx.xx.xx.xx/v1/market_place_name/url'}'"
}

Что меня смущает, так это то, почему я могу получить детали продукта раньше.

Итак, что не так с моим кодом? Любой пример или источник для изучения были бы великолепны.

1 Ответ

1 голос
/ 24 марта 2019

Проблема заключается в том, что вы передаете args dict requests.post в качестве параметра url.Запросы подтверждают, что URL-адрес, который вы указываете .post(), действителен, а URL-адрес, начинающийся с {'marketplace': ...}, явно является недействительным.

Эта часть кода:

response = requests.post(
    url=args,
    json={
         'url': url
    }, timeout=60
)

Иargs = query_parser.parse_args().

Поскольку вы просили источник, чтобы помочь вам узнать, это код, в котором запросы проверяют адаптер в начале URL-адреса, который вы можете найти в исходном коде здесь :

def get_adapter(self, url):
    """
    Returns the appropriate connection adapter for the given URL.
    :rtype: requests.adapters.BaseAdapter
    """
    for (prefix, adapter) in self.adapters.items():

        if url.lower().startswith(prefix.lower()):
            return adapter

    # Nothing matches :-/
    raise InvalidSchema("No connection adapters were found for '%s'" % url)

self.adapters.items(), который используется для проверки URL-адреса, происходит от здесь :

# Default connection adapters.
self.adapters = OrderedDict()
self.mount('https://', HTTPAdapter())
self.mount('http://', HTTPAdapter())

И mount()Метод по существу отображает ожидаемый префикс URL-адреса для одного из типов адаптеров подключения запросов в self.adapters dict.

...