【问题标题】:Image watermark in model view set in Django RestFrameWork在 Django Rest FrameWork 中设置的模型视图中的图像水印
【发布时间】:2021-04-06 19:40:23
【问题描述】:

我正在使用模型视图集开发一个简单的 django rest 框架应用程序。首先,我输入图像、名称和其他详细信息并保存到 postgresql 以及在谷歌表格中更新。 所以我试图在不使用任何 html 文件的情况下将输入图像的水印放在模型视图集中。 我已经通过python中的水印包但无法掌握它。 那么任何人都可以帮助我使用模型视图集添加输入图像的水印

这是我的观点.py

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from rest_framework.parsers import JSONParser
from .models import Article
from .serializers import ArticleSerializer
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
from rest_framework import generics
from rest_framework import mixins
from rest_framework.authentication import TokenAuthentication, BasicAuthentication, SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework import viewsets
from django.shortcuts import get_object_or_404
# Create your views here.
from PIL import Image
from rest_framework.decorators import action
from rest_framework.response import Response

import gspread
from oauth2client.service_account import ServiceAccountCredentials
from django.http import HttpResponse, Http404

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('Review-4016be63eaa5.json', scope)
client = gspread.authorize(creds)

# Find a workbook by name and open the first sheet
# Make sure you use the right name here.
sheet = client.open("review").sheet1





class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()

    def create(self, request):
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            #print(serializer.data)
            serializer.save()



            print(serializer.data)

            t = list()
            for k, v in serializer.data.items():
                t.append(v)
            print(t)
            list_of_hashes = sheet.get_all_values()
            print(list_of_hashes)
            sheet.insert_row(t, len(list_of_hashes)+1)

            #Account.objects.create_user(**serializer.validated_data)
            return Response(
                serializer.data, status=status.HTTP_201_CREATED
            )

        return Response({
            'status': 'Bad request',
            'message': 'Account could not be created with received data.'
        }, status=status.HTTP_400_BAD_REQUEST)

def update(self, request, pk=None):
    article = Article.objects.get(pk=pk)
    serializer = ArticleSerializer(article, data=request.data)
    if serializer.is_valid():
        serializer.save()
        print(serializer.data)
        c=sheet.col_values(1)
        t = list()
        for k, v in serializer.data.items():
            t.append(v)
        rownum=1
        print(c)
        print(t)
        r=str(t[0])
        if r in c:
            print("inside r", r)
            rownum = c.index(r)+1

        sheet.delete_rows(rownum)
        sheet.insert_row(t, rownum)

        return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def destroy(self, request, *args, **kwargs):
    try:
        instance = self.get_object()
        print(instance.id)
        print(type(instance.id))
        c = sheet.col_values(1)

        rownum = 2
        print(c)
        print(type(instance))
        r=str(instance.id)
        if r in c:
            print("inside r", r)
            rownum = c.index(r) + 1

            sheet.delete_rows(rownum)

        self.perform_destroy(instance)
    except Http404:
        pass
    return Response(status=status.HTTP_204_NO_CONTENT)

这是我的 Models.py

from django.db import models

# Create your models here.

class Article(models.Model):
    name = models.CharField(max_length=100)
    gender = models.CharField(max_length=100)
    age = models.IntegerField()
    image = models.ImageField()
    date=models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.id)


【问题讨论】:

    标签: python django django-rest-framework django-views


    【解决方案1】:

    你应该试试Image.paste()方法

    image = Image.open('image.jpg')
    watermark = Image.open('watermark.png')
    image.paste(watermark, (x, y), watermark)
    

    【讨论】:

    • 您可以合并此答案并通过扩展和修改 serializer.ImageField to_representation() 方法来创建您自己的 serializer.WatermarkedImageField...
    • 添加这 3 行文件后没有任何反应,也没有报错。我仍然没有任何想法 image = Image.open('image.jpg') watermark = Image.open('watermark.png') image.paste(watermark, (x, y), watermark)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多