【问题标题】:Aborting long running request in Django在 Django 中中止长时间运行的请求
【发布时间】:2020-08-04 12:43:06
【问题描述】:

我想中止对 API 的请求,该请求耗时超过 5 秒。我知道客户端代码可以有 5 秒的超时,这将确保它不会等待更长的时间来获得响应,但是即使客户端不会,Django 服务器仍然会处理请求最后收到。 据我所知,即使我在 nginx 或 gunicorn 上配置它,它们仍将充当 Django 服务器应用程序的客户端,并且会出现同样的问题 - nginx 不会等待超过 5 秒,但 Django 将继续处理请求。

有什么方法可以在 Django(应用程序服务器代码级别)本身中以某种方式中止此请求处理?

有关特定用例的上下文: 此 API 解析文件,我们对该文件的大小限制为 5 MB。即使这样,由于某种原因,有时文件解析需要超过 20-30 秒,这就是为什么我们要在超过某个阈值时中止对该 API 的请求。

【问题讨论】:

    标签: django django-rest-framework timeout django-1.11


    【解决方案1】:

    您必须在特定时间后引发特定异常。

    为了确保您始终返回相同的错误,您可以使用custom error handler。

    from rest_framework.views import exception_handler
    
    def custom_exception_handler(exc, context):
        if isinstance(exc, MyTimeoutException):
            return Response(
                {'detail': 'Your request timed out.'},
                status=status.HTTP_408_REQUEST_TIMEOUT)
    
        response = exception_handler(exc, context)
    
    
        return response
    
    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
    }
    

    【讨论】:

    • 我已经用一些额外的信息更新了这个问题。
    猜你喜欢
    • 2011-12-05
    • 2022-08-18
    • 1970-01-01
    • 2017-02-06
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2011-01-12
    相关资源
    最近更新 更多