codingjoe / django-pictures

Responsive cross-browser image library using modern codes like AVIF & WebP
BSD 2-Clause "Simplified" License
248 stars 20 forks source link

I/O operation on closed file. #110

Closed Nekidev closed 1 year ago

Nekidev commented 1 year ago

When saving an instance of m model, I'm getting the following error:

Internal Server Error: /admin/gifs/gif/add/
Traceback (most recent call last):
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\asgiref\sync.py", line 
486, in thread_handler
    raise exc_info[1]
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
    response = await get_response(request)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
    response = await wrapped_callback(
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\asgiref\sync.py", line 
448, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "C:\Users\bradl\AppData\Local\Programs\Python\Python310\lib\asyncio\tasks.py", line 408, in wait_for
    return await fut
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\asgiref\current_thread_executor.py", line 22, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\asgiref\sync.py", line 
490, in thread_handler
    return func(*args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\contrib\admin\options.py", line 688, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\utils\decorators.py", line 134, in _wrapper_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\views\decorators\cache.py", line 62, in _wrapper_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\contrib\admin\sites.py", line 242, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\contrib\admin\options.py", line 1886, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\utils\decorators.py", line 46, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\utils\decorators.py", line 134, in _wrapper_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\contrib\admin\options.py", line 1747, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\contrib\admin\options.py", line 1798, in _changeform_view
    self.save_model(request, new_object, form, not add)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\contrib\admin\options.py", line 1227, in save_model
    obj.save()
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\base.py", line 814, in save
    self.save_base(
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\base.py", line 877, in save_base
    updated = self._save_table(
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\base.py", line 1020, in _save_table
    results = self._do_insert(
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\base.py", line 1061, in _do_insert
    return manager._insert(
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\query.py", line 1805, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 1819, in execute_sql
    for sql, params in self.as_sql():
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 1743, in as_sql
    value_rows = [
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 1744, in <listcomp>
    [
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 1745, in <listcomp>
    self.prepare_value(field, self.pre_save_val(field, obj))
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 1693, in pre_save_val
    return field.pre_save(obj, add=True)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\django\db\models\fields\files.py", line 317, in pre_save
    file.save(file.name, file.file, save=False)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\pictures\models.py", line 97, in save
    self.save_all()
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\pictures\models.py", line 103, in save_all
    tasks.process_picture(self)
  File "C:\Users\bradl\Documents\GitHub\Nekos-API\api\.venv\lib\site-packages\pictures\tasks.py", line 17, in _process_picture
    with field_file.storage.open(field_file.name) as fs:
ValueError: I/O operation on closed file.

This is my model:

import uuid

from django.db import models

from pictures.models import PictureField

from dynamic_filenames import FilePattern

# Create your models here.

class Gif(models.Model):
    """
    Gif model.
    """

    class JSONAPIMeta:
        resource_name = "gif"

    id = models.UUIDField(
        default=uuid.uuid4, null=False, editable=False, primary_key=True
    )

    file = PictureField(
        upload_to=FilePattern(filename_pattern="uploads/gifs/{uuid:base32}{ext}"),
        aspect_ratios=[None, "16/9"],
        file_types=["WEBP", "GIF"],
    )

When creating instances from the admin site, that error is raised. I don't really know where to start.

codingjoe commented 1 year ago

Just out of curiosity and for future users that might run into the same issue: How did you solve it?

Nekidev commented 1 year ago

It was an issue with my file storage. It was a buggy library that failed everywhere :/ . I ended up rewriting the whole library and this stopped happening.