代码之家  ›  专栏  ›  技术社区  ›  Nikko

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

  •  0
  • Nikko  · 技术社区  · 2 年前

    我正在Django应用程序中处理一个图像。我使用rasterio来处理地理空间图像。我想将输出直接保存到模型中的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/site-packages/django/views/debug.py”,第行 get_traceback_frame_variables文件中的232 “/usr/local/lib/python3.11/site-packages/django/views/debug.py”,第行 get_exception_traceback_frames文件中的544 “/usr/local/lib/python3.11/site-packages/django/views/debug.py”,第行 get_traceback_frames文件中的490 “/usr/local/lib/python3.11/site-packages/django/views/debug.py”,第行 get_traceback_data文件中的320 “/usr/local/lib/python3.11/site-packages/django/views/debug.py”,第行 get_traceback_text文件中的403 “/usr/local/lib/python3.11/site-packages/django/utils/log.py”,第行 125 in emit File“/usr/local/lib/python3.11/logging/ 初始化 .py”, 句柄File中的第978行 “/usr/local/lib/python3.11/logging/ 初始化 .py”,第1706行,英寸 callHandlers文件“/usr/local/lib/python3.11/logging/ 初始化 .py”, 句柄File中的第1644行 “/usr/local/lib/python3.11/logging/ 初始化 .py”,_log中的第1634行
    文件“/usr/local/lib/python3.11/logging/ 初始化 .py”,第1518行 error文件 “/usr/local/lib/python3.11/site-packages/django/utils/log.py”,第行 日志响应文件中的241 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, response_for_exception文件中的第143行 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第57行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/utils/deprecation.py”, 第136行 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py”, 内部文件中的第55行 “/usr/local/lib/python3.11/site-packages/django/core/handers/base.py”, get_response文件中的第140行 “/usr/local/lib/python3.11/site-packages/rest_framework/test.py”,第行 get_response文件中的258 “/usr/local/lib/python3.11/site-packages/django/test/client.py”,第行 153英寸 呼叫 文件 “/usr/local/lib/python3.11/site-packages/django/test/client.py”,第行 805在请求文件中 “/usr/local/lib/python3.11/site-packages/rest_framework/test.py”,第行 238在请求文件中 “/usr/local/lib/python3.11/site-packages/rest_framework/test.py”,第行 286在请求文件中 “/usr/local/lib/python3.11/site-packages/django/test/client.py”,第行 通用文件中的541 “/usr/local/lib/python3.11/site-packages/rest_framework/test.py”,第行 234在通用文件中 “/usr/local/lib/python3.11/site-packages/rest_framework/test.py”,第行 210在post文件中 “/usr/local/lib/python3.11/site-packages/rest_framework/test.py”,第行 296张贴文件 “/usr/src/app/data_management/tests/test_data_managements.py”,第18行 在test_solar_pot文件“/usr/local/lib/python3.11/unittest/case.py”中, _callTestMethod文件中的第579行 “/usr/local/lib/python3.11/unittest/case.py”,运行文件中的第623行 “/usr/local/lib/python3.11/unittest/case.py”,中的第678行 呼叫
    文件 “/usr/local/lib/python3.11/site-packages/django/test/testcases.py”, _setup_and_call文件中的第416行 “/usr/local/lib/python3.11/site-packages/django/test/testcases.py”, 第381行 呼叫 文件 “/usr/local/lib/python3.11/unittest/suite.py”,运行文件中的第122行 “/usr/local/lib/python3.11/unittest/suite.py”,中的第84行 呼叫
    文件“/usr/local/lib/python3.11/unittest/runner.py”,运行中的第217行
    文件“/usr/local/lib/python3.11/site-packages/django/test/runner.py”, run_suite文件中的第980行 “/usr/local/lib/python3.11/site-packages/django/test/runner.py”,第行 运行测试文件中的1058 “/usr/local/lib/python3.11/site-packages/django/core/management/commands/test.py”, 句柄文件中的第68行 “/usr/local/lib/python3.11/site-packages/django/core/management/base.py”, 执行文件中的第448行 “/usr/local/lib/python3.11/site-packages/django/core/management/base.py”, run_from_argv文件中的第402行 “/usr/local/lib/python3.11/site-packages/django/core/management/commands/test.py”, run_from_argv文件中的第24行 “/usr/local/lib/python3.11/site-packages/django/core/management/ 初始化 .py”, 执行文件中的第440行 “/usr/local/lib/python3.11/site-packages/django/core/management/ 初始化 .py”, execute_from_command_line文件“/usr/src/app/manage.py”中的第446行, 主文件“/usr/src/app/manage.py”中的第18行,中的第22行

    扩展模块:psycopg2._psycopg,numpy.core_multiarray_umath, numpy.core_multiarray_tests,numpy.linarg_umath_ linalg, numpy.fft_pocketfft_internal,numpy.random_常见的 numpy.random.bit_generator,numpy.randam_有界整数, numpy.random_mt19937,numpy.random.mtrand,numpy.random_philox, numpy.random_pcg64,numpy.random_sfc64,numpy.random_发电机 rasterio.version、rasterio.err、rasterio _filepath、rasterior_env, rasterio._transform,rasterio.base,rasteri.crs,rasterio _features, rasterio.warp,rasterio.io,fiona_呃,fiona_几何学 Fionafiona垫片_env,fiona.schema,fiona.ogrext,fiona_crs (总计:31)

    0 回复  |  直到 2 年前
        1
  •  1
  •   Tarquinius    2 年前

    到目前为止,我还不熟悉 rasterio celery 但让我向您展示我的工作实施作为指导:

    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
    
    

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