我目前正在使用Scrapy开发REST API,我想捕获控制器级别的异常并将相应的HTTP状态代码返回给客户端。以下示例代码显示了如何引发异常:
class MySpider(Spider):
name = 'my_spider'
allowed_domains = ['www.xxxxx.com']
def __init__(self, **kw):
super(MySpider, self).__init__(**kw)
self.base_url = kw['url']
self.action = kw['action']
self.mongo = pymongo.MongoClient(kw['conn'])
def start_requests(self):
if XXX1:
raise XXX1Error('message')
yield Request(self.base_url)
def parse(self, response):
if XXX2:
raise XXX2Error('message')
# Some custom codes
这些是控制器中的示例代码(我必须在这里使用子过程,因为反应器无法重新启动):
@app.route('/xxxx/xxxx/xxxx', methods=['POST'])
def endpoint_entry():
link_json = request.get_json('link')
link = link_json.get('link')
# Initiate a sub-process for the crawling
process = subprocess.Popen(['scrapy', 'crawl', '{0}'.format('my_spider'),
'-a', 'url={0}'.format(link),
'-a', 'action={0}'.format('download'),
'-a', 'conn={0}'.format(MONGO_CONNECTION_STRING)])
process.wait()
if process.returncode != 0:
return 'Something was not right', 400
return 'Scrapping has been processed', 200
但是,看起来子流程中引发的异常不会导致子流程的返回码为1,我什至尝试直接调用sys.exit(1)
而不是raise XXXError('message')
,并且返回代码仍为0,我还尝试使用spider_error
信号来捕获引发的异常,并引发新异常或退出该处的子流程,但它也无法正常工作。所以我真的很想知道是否有任何办法可以解决这个问题?还是根本没有适当的解决方案?我会很感激任何答案!