[英]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中。
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)
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)),
]
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' , )
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
#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.