Django drf 请求似乎需要很长时间才能重新启动

给定 Y

我正在将 Django 与 DRF 一起使用,并且我有一个将信息写入 csv 文件然后将链接发送给用户的视图集。

当检索到的数据不是太大时,该函数可以正常工作,因此当响应时间合理时,一切正常。

问题是请求需要更长的时间。它似乎只是从请求调用中自行重新启动

    def get_operations(self, request):
        logger.info("Starting export request...")
   #[...business logic to retrive the data ...]
        file_url = settings.MEDIA_PREFIX_PATH + file_path
        logger.info("Saving response in %s", file_absolute_path)
        f = open(file_absolute_path, "w+")
        all_operations = operations.all()
        i = 0
        for operation in all_operations:
            i = i + 1
            #code to show progress in the log
            if (i / len(all_operations)*1000) % 5 == 0:
                logger.info("Progress:  %d ", (i / len(all_operations)*100))

            f.write("%s,%d,%d,%d,%s,%s\n" % (operation.datetime, operation.amount, operation.field2, operation.field3, operation.field5, operation.field6))
        logger.info("Response saved, sending link %s", file_url)
        return Response(file_url)

在日志中,这就是我得到的

INFO 2018-11-26 11:23:33,525 Starting export request...
INFO 2018-11-26 11:23:34,223 Response retrieved : 17010 records
INFO 2018-11-26 11:23:34,225 Saving response in /tmp/generated_csv/1543231414.2250094.csv
INFO 2018-11-26 11:23:42,825 Progress:  10 
INFO 2018-11-26 11:23:51,161 Progress:  20 
INFO 2018-11-26 11:23:59,072 Progress:  30 
INFO 2018-11-26 11:24:07,694 Starting export request...
INFO 2018-11-26 11:24:08,346 Response retrieved : 17010 records
INFO 2018-11-26 11:24:08,348 Saving response in /tmp/generated_csv/1543231448.3486001.csv
INFO 2018-11-26 11:24:16,653 Progress:  10 
INFO 2018-11-26 11:24:24,271 Progress:  20 
INFO 2018-11-26 11:24:32,248 Progress:  30 
INFO 2018-11-26 11:24:42,573 Starting export request...
INFO 2018-11-26 11:24:44,101 Response retrieved : 17010 records
INFO 2018-11-26 11:24:44,109 Saving response in /tmp/generated_csv/1543231484.1097722.csv
INFO 2018-11-26 11:24:55,092 Progress:  10 
INFO 2018-11-26 11:25:04,131 Progress:  20 
INFO 2018-11-26 11:25:11,242 Progress:  30 
INFO 2018-11-26 11:25:16,801 Starting export request...
INFO 2018-11-26 11:25:17,499 Response retrieved : 17010 records
INFO 2018-11-26 11:25:17,501 Saving response in /tmp/generated_csv/1543231517.5013359.csv

我确定问题不是来自客户端,因为我也与邮递员一起尝试过。

我只是不明白什么会导致请求被单独调用。

谢谢

鲁德拉

我猜这不是 Django 或 DRF 的问题,很可能是gunicorn您用来为 Django 提供服务的问题。因此,不要在同步模式下进行这种大文件操作,而是尝试任何异步过程。例如:

import threading 

...

def process_file(self, file_absolute_path, all_operations):
        f = open(file_absolute_path, "w+")
        i = 0
        for operation in all_operations:
            i = i + 1
            # it will be visible in your logger file, so you can see the progress
            if (i / len(all_operations)*1000) % 5 == 0:
                logger.info("Progress:  %d ", (i / len(all_operations)*100))
                f.write("%s,%d,%d,%d,%s,%s\n" % (operation.datetime, operation.amount, operation.field2, operation.field3, operation.field5, operation.field6))

def get_operations(self, request):
    logger.info("Starting export request...")
    all_operations = operations.all()
    file_url = settings.MEDIA_PREFIX_PATH + file_path
    t = threading.Thread(target=self.process_file,
                         args=(file_absolute_path, all_operations))
    t.start()
    logger.info("Saving response in %s", file_absolute_path)
    logger.info("Response saved, sending link %s", file_url)
    return Response(file_url)

这里我给出了使用 Python 的Threading 的例子但是您也可以将Celery用于此目的(及其更好的解决方案)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django需要很长时间才能加载

来自分类Dev

Django 和 DRF,请求的 ip 限制

来自分类Dev

django drf 登录模板

来自分类Dev

Django DRF 外键

来自分类Dev

Django单元测试需要很长时间才能创建测试数据库

来自分类Dev

如何在Django中处理PUT请求?(不在drf中)

来自分类Dev

Django多对多模型DRF

来自分类Dev

DRF:在 Django 中上传图像

来自分类Dev

混合 Django 和 DRF 网址

来自分类Dev

doInBackground需要很长时间才能启动

来自分类Dev

STS需要很长时间才能启动

来自分类Dev

Ubuntu需要很长时间才能启动

来自分类Dev

Xubuntu需要很长时间才能启动

来自分类Dev

SymmetricDS 需要很长时间才能启动

来自分类Dev

模型需要花费很长时间才能加载到GCP应用引擎上,并且工作人员需要重新启动

来自分类Dev

如何在django drf中检查请求正文中的int值

来自分类Dev

如何在django drf中检查请求正文中的int值

来自分类Dev

如何将用户与Django drf中的发布请求相关联

来自分类Dev

如何在django drf中检查请求正文中的int值

来自分类Dev

Django和DRF在保存之前如何使用对API的POST请求的字段?

来自分类Dev

如何使用DRF的ModelSerializer创建Django用户

来自分类Dev

带有Django drf的Openapi 3

来自分类Dev

无法使用提供的凭据登录django DRF

来自分类Dev

使用DRF反向过滤Django模型

来自分类Dev

如何使用 DRF 配置流 django

来自分类Dev

Django - 如何为 DRF ImageField 编写测试

来自分类Dev

ElasticSearch重新启动花费很长时间

来自分类Dev

Xubuntu 18.04内核需要很长时间才能启动

来自分类Dev

Ubuntu 16.04需要很长时间才能启动