如何将Flask-RESTPlus与请求结合:HTTP for Humans?

时间:2019-03-24 01:47:45

标签: python flask python-requests flask-restful flask-restplus

我正在使用 Flask-RESTPlus 建立端点,并使用 Requests:HTTP for Humans 从一个电子商务网站中抓取产品详细信息。

我已经使用 Requests 获得了完美的产品详细信息,但是当我将其与 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 个答案:

答案 0 :(得分:1)

问题是您要将args字典作为url参数传递到requests.post。请求会验证您提供给.post()的网址是有效的,并且以{'marketplace': ...}开头的网址显然是无效的网址。

这部分代码:

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

还有args = query_parser.parse_args()

在您要求提供源代码以帮助您学习的过程中,这是请求代码检查网址开头的适配器的代码,您可以在源代码here中找到该代码:

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()来自here

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

mount()方法实际上将期望的URL前缀映射到self.adapters字典中请求的连接适配器类型之一。