简体   繁体   English

用户在Django Rest API中发布图片时如何调用函数

[英]How to call a function when the user POSTs an image in django rest api

I am making a face detection api that will take image as an input from a user. 我正在制作一个面部检测API,它将图像作为来自用户的输入。 How can i call a function when the user creates a POST request? 用户创建POST请求时如何调用函数? I have the face detection code that was made using opencv i want to integrate it in my api. 我有使用opencv制作的面部检测代码,我想将其集成到我的api中。

models.py models.py

from django.db import models
import uuid

from .validators import validate_file_extension
def scramble_uploaded_filename(instance,filename):
    extension = filename.split(".")[-1]

    reformated = "{}.{}".format(uuid.uuid4(),extension)

    return reformated

def scramble_uploaded_filename1(instance,filename):
    extension = filename.split(".")[-1]

    return "{}.{}".format(uuid.uuid4(),extension)

class UploadVideo(models.Model):
    video = models.FileField('Uploaded Video',upload_to=scramble_uploaded_filename1, validators=[validate_file_extension] )
class UploadImage(models.Model):
    image = models.ImageField('Uploaded Image', upload_to=scramble_uploaded_filename)

urls.py in resp api 分别在api中的urls.py

from django.conf.urls import url, include
from rest_framework import routers
from imageupload_rest.viewsets import UploadImageViewSet, UploadVideoViewSet

router = routers.DefaultRouter()
router.register('images', UploadImageViewSet, 'images')
router.register('videos', UploadVideoViewSet, 'videos')
app_name = 'reviews'
urlpatterns = [
    url(r'^',include(router.urls)),
]

serializers.py serializers.py

from rest_framework import serializers
from imageupload.models import UploadImage, UploadVideo

class UploadImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = UploadImage
        fields = ('pk', 'image', )

class UploadVideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = UploadVideo
        fields = ('pk', 'video' , )

viewsets.py viewsets.py

from rest_framework import viewsets
from imageupload_rest.serializers import UploadImageSerializer, UploadVideoSerializer
from imageupload.models import UploadImage, UploadVideo

class UploadImageViewSet(viewsets.ModelViewSet):
queryset = UploadImage.objects.all()
    serializer_class = UploadImageSerializer

class UploadVideoViewSet(viewsets.ModelViewSet):
    queryset = UploadVideo.objects.all()
    serializer_class = UploadVideoSerializer

imagefunction.py this is stored in the same folder as viewsets imagefunction.py这与视图集存储在同一文件夹中

#when the user posts an image this function should run
import cv2
import os
import numpy as np
def image(path):
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    #trainingData.yml is my pretrained model which includes a unique id for each user
    recognizer.read('recognizer/trainingData.yml')
    detector = `cv2.CascadeClassifier('cascades\data\haarcascade_frontalface_alt2.xml')`   
    im = cv2.imread(path)
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
    for (x, y, w, h) in faces:
        cv2.rectangle(im, (x, y), (x + w, y + h), (225, 0, 0), 2)
        Id, conf = recognizer.predict(gray[y:y + h, x:x + w])
        if 2 < conf < 125:
            cv2.putText(im, str(Id), (x, y + h),fontface, fontscale, fontcolor)
    cv2.imshow('Recognition', im)
    cv2.imwrite("image.jpg",im)
    cv2.waitKey(0)
    res = "true"
    return res

I want this function to run after the user POSTs an image. 我希望此功能在用户发布图像后运行。

As you are using modelViewset you need to overwrite existing post method of modelViewset life-cycle method. 使用modelViewset您需要覆盖modelViewset生命周期方法的现有post方法。 check CreateAPIView 检查CreateAPIView

from .imagefunction import image
from rest_framework import status

class UploadImageViewSet(viewsets.ModelViewSet):
    queryset = UploadImage.objects.all()
    serializer_class = UploadImageSerializer
    def post(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.data)
         serializer.is_valid(raise_exception=True)
         self.perform_create(serializer)
         // call your image recognition funciton, what should response some thing 
         is_face_include = image(serializer.data.get('image')) // or may be image(serializer.data.get('image')).url 
         if is_face_include: // we need our success method 
            return Response({message: "succesfully upload image"}, status=status.HTTP_201_CREATED)
         else:
            Response({message: "no face found"}, status=status.HTTP_400_BAD_REQUEST)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM