如何将 Flask-RESTPlus 与 Requests: HTTP for Humans 结合起来?

How to combine Flask-RESTPlus with Requests: HTTP for Humans?

我正在使用 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'}'"
}

让我感到困惑的是为什么我之前可以获取产品详细信息。

那么,我的代码有什么问题吗?任何示例或学习资源都很好。

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

这部分代码:

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

args = query_parser.parse_args().

正如您要求提供源代码以帮助您学习一样,这是请求在 url 开头检查适配器的代码,您可以在源代码 here:[=24 中找到它=]

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)

用于检查url的self.adapters.items()来自here:

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

并且 mount() 方法本质上将预期的 url 前缀映射到 self.adapters 字典中的一种请求连接适配器类型。