如何将 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
字典中的一种请求连接适配器类型。
我正在使用 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
字典中的一种请求连接适配器类型。