我正在使用 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'}'"
}
让我感到困惑的是为什么我之前可以获得产品详细信息。
那么,我的代码有什么问题吗?任何要学习的示例或资源都很棒。
答案 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
字典中请求的连接适配器类型之一。