如何从临时文件写入Django FileField?

lymnna71  于 2023-01-31  发布在  Go
关注(0)|答案(1)|浏览(134)

我正在Django应用中处理一张图片。我使用了rasterio来处理地理空间图片。我想将输出直接保存到Model中的FileField。我使用了一个tempfile来编写rasterio的输出,并使用了Model.FileField.save方法希望它能引用我的Model示例。
我有一个简单的模型:

class MaskedLayer(models.Model):
    name = models.CharField(max_length=250, blank=True)
    file = models.FileField(
        upload_to='masked',
        null=True,
        max_length=500)

然而,在我的任务中,这是一个例子:

from celery import shared_task
import rasterio
import tempfile

from app.models import MaskedLayer

@shared_task
def process_image():

    mask_layer_name = 'processed_image.tif'
    masked_layer = MaskedLayer.objects.create()

    with rasterio.open('example.tif') as dataset: # only example of reading/processing of image
        out_image = dataset.read()

    with tempfile.NamedTemporaryFile() as tmpfile:
        tmpfile.write(out_image)

        with rasterio.open(tmpfile.name) as dataset:
            masked_layer.file.save(mask_layer_name, File(dataset))

    pass

我得到这个响应。我不确定错误。请随意使用**example file
致命的Python错误:分段故障
当前线程0x00007f453b463740(最新调用优先):文件"/usr/local/lib/python3.11/站点包/django/views/debug. py ",获取回溯帧变量的第232行文件"/usr/local/lib/python3.11/站点包/django/views/debug. py",获取异常回溯帧的第544行文件"/usr/local/lib/python3.11/站点包/django/views/debug. py ",获取回溯帧文件"/usr/local/lib/python3.11/站点包/django/视图/调试. py "中的第490行,获取回溯数据文件"/usr/local/lib/python3.11/站点包/django/视图/调试. py"中的第320行,在get_traceback_text文件"/usr/local/lib/python3.11/站点包/django/utils/log.py "中的第403行,在发射文件"/usr/local/lib/python3.11/日志记录/init. py"中的第125行,在句柄文件"/usr/local/lib/python3.11/日志记录/init. py "中的第978行,调用处理程序文件"/usr/local/lib/python3.11/logging/init. py "中的第1706行,句柄文件"/usr/local/lib/python3.11/logging/init. py"中的第1644行,_log中的第1634行
文件"/usr/local/lib/python3.11/logging/init. py ",错误文件"/usr/local/lib/python3.11/站点包/django/utils/log. py"中的第1518行,日志响应文件"/usr/local/lib/python3.11/站点包/django/core/handlers/exception.py "中的第241行,第143行在响应异常文件"/usr/local/lib/python3.11/站点包/django/core/handlers/exception.py "中,第57行在内部文件"/usr/local/lib/python3.11/站点包/django/utils/deprecation.py"中,* * call
文件中的第136行"/usr/local/lib/python3.11/站点包/django/core/handlers/exception.py ",内部文件中的第55行"/usr/local/lib/python3.11/站点包/django/utils/deprection.py",call文件中的第136行"/usr/local/lib/python3.11/站点包/django/core/handlers/exception.py ",内部文件"/usr/local/lib/python3.11/站点包/django/utils/deprecation. py "中的第55行,调用文件"/usr/local/lib/python3.11/站点包/django/core/handlers/exception. py"中的第136行,内部文件"/usr/local/lib/python3.11/站点包/django/utils/deprecation. py "中的第55行,* * call文件中的第136行"/usr/local/lib/python3.11/站点包/django/core/handlers/exception.py ",内部文件中的第55行"/usr/local/lib/python3.11/站点包/django/utils/deprection.py",call文件中的第136行"/usr/local/lib/python3.11/站点包/django/core/handlers/exception.py ",内部文件"/usr/local/lib/python3.11/站点包/django/utils/deprecation. py "中的第55行,调用文件"/usr/local/lib/python3.11/站点包/django/core/handlers/exception. py"中的第136行,内部文件"/usr/local/lib/python3.11/站点包/django/utils/deprecation. py "中的第55行,* * call文件"/usr/local/lib/python3.11/站点包/django/core/handler/exception.py "中的第136行,内部文件"/usr/local/lib/python3.11/站点包/django/core/handler/base.py"中的第55行,获取响应文件"/usr/local/lib/python3.11/站点包/rest_framework/test. py "中的第140行,获取响应文件"/usr/local/lib/python3.11/站点包/django/测试/客户端. py "中的第258行,调用文件"/usr/local/lib/python3.11/站点包/django/测试/客户端. py"中的第153行,请求文件"/usr/local/lib/python3.11/站点包/rest_framework/测试. py "中的第805行,请求文件"/usr/local/lib/python3.11/站点包/rest_framework/test. py "中的第238行、请求文件"/usr/local/lib/python3.11/站点包/django/test/client. py"中的第286行、通用文件"/usr/local/lib/python3.11/站点包/rest_framework/test. py "中的第541行、在通用文件"/usr/local/lib/python3.11/站点包/rest_framework/test. py "中的第234行,在后文件"/usr/local/lib/python3.11/站点包/rest_framework/test. py"中的第210行,在后文件"/usr/src/app/data_management/tests/test_data_management. py "中的第296行,第18行位于测试太阳能pot文件"/usr/local/lib/python3.11/unittest/case. py "中,第579行位于调用测试方法文件"/usr/local/lib/python3.11/unittest/case. py"中,第623行位于运行文件"/usr/local/lib/python3.11/unittest/case. py "中,第678行位于调用
文件"/usr/local/lib/python3.11/站点包/django/测试/测试用例. py ",设置和调用文件"/usr/local/lib/python3.11/站点包/django/测试/测试用例. py"中的第416行,调用文件"/usr/local/lib/python3.11/单元测试/套件. py "中的第381行,运行文件"/usr/local/lib/python3.11/单元测试/套件. py"中的第122行,* * 呼叫**中的第84行
运行中的文件"/usr/local/lib/python3.11/unittest/runner. py ",第217行

文件"/usr/local/lib/python3.11/站点包/django/test/runner. py ",运行套件文件"/usr/local/lib/python3.11/站点包/django/test/runner. py"中的第980行,运行测试文件"/usr/local/lib/python3.11/站点包/django/core/management/commands/test. py "中的第1058行,句柄文件"/usr/local/lib/python3.11/站点包/django/core/管理/基础. py "中的第68行,执行文件"/usr/local/lib/python3.11/站点包/django/core/管理/基础. py"中的第448行,运行参数文件"/usr/local/lib/python3.11/站点包/django/core/管理/命令/测试. py "中的第402行,运行参数文件"/usr/local/lib/python3.11/站点包/django/core/管理/init. py"中的第24行,执行文件"/usr/local/lib/python3.11/站点包/django/core/管理/init. py "中的行440,执行命令行文件"/usr/src/app/www.example.com"中的行446,manage.py", line 18 in main File "/usr/src/app/manage.py", line 22 in
扩展模块:psycopg2._psycopg,数值.核心._多数组_umath,数值.核心._多数组_测试,数值.线性代数._umath_线性代数,数值. fft._数据包fft_内部,数值.随机._公共,数值.随机.位_生成器,数值.随机._有界_整数,数值.随机._mt19937,数值.随机. mtrand,数值.随机._philox,数值.随机._pcg64,数值.随机._sfc64,数值.随机._生成器,栅格._版本,栅格._错误,光栅._文件路径、光栅._环境、光栅._转换、光栅._基础、www.example.com、光栅._特征、光栅._变形、光栅._io、fiona._错误、fiona._几何、fiona._shim、fiona._环境、fiona.模式、fiona. ogrext、fiona._crs(总计:rasterio.crs, rasterio._features, rasterio._warp, rasterio._io, fiona._err, fiona._geometry, fiona._shim, fiona._env, fiona.schema, fiona.ogrext, fiona._crs (total: 31)

hgtggwj0

hgtggwj01#

到目前为止,我对rasteriocelery并不熟悉,但让我向您展示我的工作实现作为指导:

import io
from django.core.files.images import ImageFile

def _upload_location(instance, filename):
    return f'/some/path/{filename}'

class MyModel(models.Model):
    model_image_field = models.ImageField(null=True, blank=True, upload_to=_upload_location, editable=False)

    def save_structure_img(self):
        tmp_img = io.BytesIO()  # create buffer
        structure_img = self.create_structure_img() # create img 
        structure_img.save(tmp_img, 'PNG')  # utilize save method of your image to save it to the buffer
        name = "your_wanted_filename"  # create a name
        self.model_image_field.save(f'{name}.png', ImageFile(tmp_img)) # save buffer to model_image field

我知道,我编辑了structure_img的创建,但这不重要,因为它是特定于我的项目。
让我试着把它翻译成您的用例:

import io
from django.core.files.images import ImageFile

@shared_task
def process_image():

    mask_layer_name = 'processed_image.tif'
    masked_layer = MaskedLayer.objects.create()

    with rasterio.open('example.tif') as dataset: # only example of reading/processing of image
        out_image = dataset.read()
    
    tmp_img = io.BytesIO() # create buffer
    out_image.save(tmp_img, 'PNG')
    # i hope this is the right place where out_image has a `.save` method.
    name = "your_wanted_filename"
    
    masked_layer.field.save(f'{name}.png', ImageFile(tmp_img))
    pass

我也承认我不知道你提出的错误是想告诉我什么。但是我感觉数据库在抱怨你试图插入的内容。如果你这样寻找一个如何准确修复那个错误的答案,我的答案不是你要找的。它更像是同一个解决方案的替代方法。

相关问题