Django将excel文件发送到芹菜任务。MemoryUploadedFile中的错误

Django将excel文件发送到芹菜任务。MemoryUploadedFile中的错误,django,celery,Django,Celery,我有后台进程-读取excel文件并保存此文件中的数据。我需要在后台进程中读取文件。但是我在MemoryUploadedFile中有错误。 我的代码 我的方法看起来像 @app.task def import_data( file, company, file_type, email): // some code 但是我在MemoryUploadedFile中有错误 如何将文件发送到cellery而不出错 当您延迟任务时,芹菜将尝试

我有后台进程-读取excel文件并保存此文件中的数据。我需要在后台进程中读取文件。但是我在MemoryUploadedFile中有错误
。
我的代码

我的方法看起来像

@app.task
def import_data(
        file,
        company,
        file_type,
        email):
// some code
但是我在MemoryUploadedFile中有错误


如何将文件发送到cellery而不出错

当您延迟任务时,芹菜将尝试序列化包含文件的参数

无法序列化文件,尤其是内存中的文件


因此,要解决此问题,您必须保存文件并将文件路径传递给延迟函数,然后在那里读取文件并进行计算。

当您延迟任务时,芹菜将尝试序列化包含文件的参数

无法序列化文件,尤其是内存中的文件


因此,要解决此问题,您必须保存文件并将文件路径传递给延迟函数,然后在那里读取文件并进行计算。

芹菜不知道如何序列化文件对象等复杂对象。然而,这可以很容易地解决。我要做的是将文件编码/解码为Base64字符串表示形式。这使我可以通过芹菜直接发送文件

下面的示例显示了如何(我有意将每个转换分开放置,尽管这可以以更具python风格的方式安排):


这对于大文件来说效率很低,但对于中小型临时文件来说却非常方便。

芹菜不知道如何序列化文件对象等复杂对象。然而,这可以很容易地解决。我要做的是将文件编码/解码为Base64字符串表示形式。这使我可以通过芹菜直接发送文件

下面的示例显示了如何(我有意将每个转换分开放置,尽管这可以以更具python风格的方式安排):


这对于大文件来说效率很低,但对于中小型临时文件来说却非常方便。

理想情况下,它会被保存到某个共享文件系统中,在该系统中,所有芹菜节点都可以访问。。。一般来说(如果我记得的话,这也是芹菜文档中的内容),人们应该尽量避免传递大型对象,即使它们可以序列化,因为默认情况下,这些对象在芹菜中保留了相当长的一段时间…它最好保存到某个共享文件系统中,所有芹菜节点都可以访问该文件系统。。。一般来说(如果我记得的话,这也是芹菜文档中的),人们应该尽量避免传递大型对象,即使它们可以序列化,因为这些对象在芹菜中默认保留了很长一段时间。。。
@app.task
def import_data(
        file,
        company,
        file_type,
        email):
// some code
import base64
import tempfile

# (Django, HTTP server)
file = request.FILES['files'].file
file_bytes = file.read()
file_bytes_base64 = base64.b64encode(file_bytes)
file_bytes_base64_str = file_bytes_base64.decode('utf-8') # this is a str

# (...send string through Celery...)

# (Celery worker task)
file_bytes_base64 = file_bytes_base64_str.encode('utf-8')
file_bytes = base64.b64decode(file_bytes_base64)

# Write the file to a temporary location, deletion is guaranteed
with tempfile.TemporaryDirectory() as tmp_dir:
    tmp_file = os.path.join(tmp_dir, 'something.zip')
    with open(tmp_file, 'wb') as f:
        f.write(file_bytes)
    # Process the file