{"library":"sorl-thumbnail","title":"Sorl Thumbnail","type":"library","description":"Sorl Thumbnail is a popular and flexible Django application for generating image thumbnails. It handles image resizing, cropping, and caching, offering support for various storage backends (local, S3, Google Cloud Storage) and image processing engines (Pillow, ImageMagick). The current version is 13.0.0, with an active release cadence, typically aligning with Django and Python version updates.","language":"python","status":"active","last_verified":"Sat May 16","install":{"commands":["pip install sorl-thumbnail Pillow","pip install sorl-thumbnail Pillow redis django-storages"],"cli":null},"imports":["from sorl.thumbnail import ImageField","from sorl.thumbnail import get_thumbnail","{% load thumbnail %}"],"auth":{"required":false,"env_vars":[]},"links":{"homepage":"https://sorl-thumbnail.readthedocs.io/en/latest/","github":"https://github.com/jazzband/sorl-thumbnail","docs":null,"changelog":null,"pypi":"https://pypi.org/project/sorl-thumbnail/","npm":null,"openapi_spec":null,"status_page":null,"smithery":null},"quickstart":{"code":"import os\nimport django\nfrom django.conf import settings\nfrom django.core.files.uploadedfile import SimpleUploadedFile\nfrom django.db import models\n\nsettings.configure(\n    INSTALLED_APPS=[\n        'django.contrib.auth',\n        'django.contrib.contenttypes',\n        'django.contrib.sessions',\n        'django.contrib.messages',\n        'django.contrib.staticfiles',\n        'sorl.thumbnail',\n        'myapp'\n    ],\n    DATABASES={\n        'default': {\n            'ENGINE': 'django.db.backends.sqlite3',\n            'NAME': ':memory:',\n        }\n    },\n    MEDIA_ROOT=os.path.join(os.path.dirname(__file__), 'media'),\n    STATIC_ROOT=os.path.join(os.path.dirname(__file__), 'static'),\n    STATIC_URL='/static/',\n    THUMBNAIL_KEY_PREFIX='sorl-test-',\n    THUMBNAIL_STORAGE='default',\n    STORAGES = {\n        'default': {\n            'BACKEND': 'django.core.files.storage.FileSystemStorage'\n        },\n        'thumbnails': {\n            'BACKEND': 'django.core.files.storage.FileSystemStorage'\n        }\n    },\n    SECRET_KEY=os.environ.get('DJANGO_SECRET_KEY', 'a-very-secret-key-for-testing'),\n    TEMPLATES=[\n        {\n            'BACKEND': 'django.template.backends.django.DjangoTemplates',\n            'APP_DIRS': True,\n            'OPTIONS': {\n                'context_processors': [\n                    'django.template.context_processors.debug',\n                    'django.template.context_processors.request',\n                    'django.contrib.auth.context_processors.auth',\n                    'django.contrib.messages.context_processors.messages',\n                ],\n            },\n        },\n    ],\n)\ndjango.setup()\n\nclass Item(models.Model):\n    image = ImageField(upload_to='items')\n\n    def __str__(self):\n        return f\"Item {self.pk}\"\n\n# --- Example Usage ---\nfrom sorl.thumbnail import get_thumbnail\nfrom django.template import Context, Template\n\n# Create a dummy image file\ndummy_image = SimpleUploadedFile(\"test_image.jpg\", b\"file_content\", content_type=\"image/jpeg\")\n\n# Save an item with the image\nitem = Item.objects.create(image=dummy_image)\n\n# Generate a thumbnail using the low-level API\nthumbnail_obj = get_thumbnail(item.image, '100x100', crop='center', quality=95)\nprint(f\"Generated thumbnail URL: {thumbnail_obj.url}\")\n\n# Simulate template rendering (requires a request context usually)\n# For a true runnable example without a full Django app, this is tricky.\n# This part demonstrates the template tag usage conceptually.\n# In a real Django project, you'd put {% load thumbnail %} and the tag in your .html file.\n\n# Example template snippet\ntemplate_str = \"\"\"\n{% load thumbnail %}\n<img src=\"{% thumbnail item.image '50x50' crop='center' as im %}{{ im.url }}{% endthumbnail %}\">\n\"\"\"\n\ntemplate = Template(template_str)\ncontext = Context({'item': item})\n\n# This will likely fail without a full Django test setup that handles file storage properly\n# print(template.render(context))\n\n# Clean up (optional, for real apps, let Django manage)\nitem.image.delete(save=False)\nitem.delete()\n","lang":"python","description":"To get started, install `sorl-thumbnail` and `Pillow`, then add `sorl.thumbnail` to your Django `INSTALLED_APPS`. If using the cached database key-value store (the default), run `python manage.py migrate`. You can then use the `ImageField` in your models or the `{% thumbnail %}` template tag to generate and display thumbnails. Remember to configure `MEDIA_ROOT` and potentially `STORAGES` in your Django settings. This quickstart includes a basic Django setup for a runnable example.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":"12.11.0","pypi_latest":"13.0.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.4,"avg_import_s":0.7,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"37.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.55,"mem_mb":16.2,"disk_size":"90.3M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":2.3,"import_time_s":null,"mem_mb":null,"disk_size":"39M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.5,"import_time_s":0.48,"mem_mb":16.2,"disk_size":"91M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"40.2M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.62,"mem_mb":18,"disk_size":"96.0M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":2.2,"import_time_s":null,"mem_mb":null,"disk_size":"41M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.2,"import_time_s":0.56,"mem_mb":18,"disk_size":"97M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"31.9M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.85,"mem_mb":17.2,"disk_size":"87.3M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":2,"import_time_s":null,"mem_mb":null,"disk_size":"33M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.2,"import_time_s":0.85,"mem_mb":17.2,"disk_size":"88M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"31.7M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.86,"mem_mb":18.1,"disk_size":"87.2M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":2.1,"import_time_s":null,"mem_mb":null,"disk_size":"33M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.3,"import_time_s":0.83,"mem_mb":18.1,"disk_size":"88M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"35.1M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"85.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":2.6,"import_time_s":null,"mem_mb":null,"disk_size":"36M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"sorl-thumbnail","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":5.2,"import_time_s":null,"mem_mb":null,"disk_size":"87M"}]}}