Получение изображений разных размеров Django Rest Framework
Есть задача давать пользователю картинки с разными размерами в зависимости от группы. Есть 3 группы пользователей, не учитывая админа (Basic, Premium и Enterprise).
- 1-я может получить изображение только 200х200
- 2-я 200х200 или 400х400
- 3-я любое (200х200, 400х400 и оригинальное)
Пробую сделать что-то такое, но при попытке обрезать изображение и получить его:
Изображение «http://127.0.0.1:8000/api/1/» не может быть показано, так как содержит ошибки.
Но как мне кажется я использую неправильный подход, и лучше использовать разные Url для разных размеров и ограничивать доступ определённым группам к этим url, но я не понимаю как это сделать.
model
from django.db import models
# Create your models here.
class Image(models.Model):
title = models.CharField(max_length=255)
image = models.ImageField(upload_to='media/pictures/')
alt = models.CharField(max_length=255)
added_at = models.DateTimeField(auto_now_add=True, editable=True)
def __str__(self):
return self.title
urls (приложения)
from django.urls import path
from .views import ImageAPIView
urlpatterns = [
path('<int:pk>/', ImageAPIView.as_view())
]
urls (всего проекта)
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from image_app import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('auth/', include('rest_framework.urls')),
path('api/', include('image_api.urls')),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views
import io
from django.shortcuts import render
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from sorl.thumbnail import get_thumbnail
from .custom_renderers import *
from .models import *
from .permissions import *
# Create your views here.
class ImageAPIView(generics.RetrieveAPIView):
renderer_classes = [JPEGRenderer]
# permission_classes = (BasicPermission,)
def get(self, request, *args, **kwargs):
group = request.user.groups.get()
queryset = Image.objects.get(pk=self.kwargs['pk']).image
print(type(queryset))
if group.name == 'Basic':
data = get_thumbnail(queryset, '200x200', crop='center', quality=99)
return Response(data, content_type='image/jpg')
# return Response(, content_type='image/jpg')
elif group.name == 'Enterprise':
data = queryset
return Response(data, content_type='image/jpg')
elif group.name == 'Premium':
data = queryset
return Response(data, content_type='image/jpg')
Плюс у меня кастомный renderer
renderer
from rest_framework import renderers
class JPEGRenderer(renderers.BaseRenderer):
media_type = 'image/jpeg'
format = 'jpg'
charset = None
render_style = 'binary'
def render(self, data, accepted_media_type=None, renderer_context=None):
return data
class PNGRenderer(renderers.BaseRenderer):
media_type = 'image/png'
format = 'png'
charset = None
render_style = 'binary'
def render(self, data, accepted_media_type=None, renderer_context=None):
return data