Python金字塔增加请求超时

时间:2018-12-12 14:02:32

标签: python timeout pyramid

我正在使用Python Pyramid rest api,在我需要处理一个excel的一个请求中,对于它的每一行,我都获得了GPS坐标并进行了大量验证,这仅意味着请求可能需要花费10分钟的时间来处理,我需要使用json将响应返回给调用者。我无法通过WebSocket发送其他任何内容。

我的问题是:如何增加此请求的超时时间?这是我的方法:

@view_config(route_name='client_api_upload',
             request_method='POST',
             renderer='json',
             permission='upload client')
def client_api_upload(request):

    client_id = request.POST['client_id']
    filename = request.POST['file'].filename
    input_file = request.POST['file'].file
    extension = os.path.splitext(filename)[1]
    new_file_name = str(uuid.uuid4())+extension
    file_path = os.path.join(tempfile.gettempdir(), new_file_name)

    with open(file_path, 'wb') as output_file:
        shutil.copyfileobj(input_file, output_file)

    importer = ClientBuildingImporter(client_id=client_id, db_session=request.dbsession)
    importer.import_building_from_excel(excel_file_path=file_path)

    return importer.import_result

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我不认为是金字塔关闭了连接,更可能是为您的应用程序提供服务的网络服务器(Apache / Nginx等)。金字塔本身通常很乐意随心所欲地拖下去。

我同意@SamMason的观点,即有更好的(但更复杂的)方法可以正确执行长时间运行的任务,但是在某些受控情况下,最好使用一个长时间运行的请求来执行大量处理。我有一些迁移/维护脚本,这些脚本要花几个小时才能完成,并且运行良好。

让所有参与者(Web服务器,代理,浏览器等)感到满意的技巧是确保应用程序返回的数据有点滴,不要让HTTP连接只是闲置在那里。

不幸的是,使用Pyramid时,流式请求不是很简单,但是有some resources可能会为您指明正确的方向。

答案 1 :(得分:0)

正确的方法是不要在请求中执行长时间运行的任务。

你能做的是

  • 发出启动该任务的初始请求,并立即返回。该请求将任务写入数据库。
  • 具有后台工作进程(例如Celery)来处理任务
  • 具有前端轮询/ JavaScript /重定向循环,以检查后台进程是否已完成任务