尝试将请求图像从Django传递到Python脚本
我正在创建一个项目,其中我正在向Django本地服务器发送一个带有映像的请求。接收并保存图像,效果良好 但是,在收到图像后,我试图将该文件传递给我的python脚本。在那里,它应该运行带有图像的脚本,并将数据返回给用户 我被卡住了,因为我似乎无法将图像文件名传递给python脚本,因此无法使用图像运行脚本 有人知道如何做到这一点吗 许多(#):是我尝试做的 视图.py尝试将请求图像从Django传递到Python脚本,django,api,django-rest-framework,request,Django,Api,Django Rest Framework,Request,我正在创建一个项目,其中我正在向Django本地服务器发送一个带有映像的请求。接收并保存图像,效果良好 但是,在收到图像后,我试图将该文件传递给我的python脚本。在那里,它应该运行带有图像的脚本,并将数据返回给用户 我被卡住了,因为我似乎无法将图像文件名传递给python脚本,因此无法使用图像运行脚本 有人知道如何做到这一点吗 许多(#):是我尝试做的 视图.py class ImageViewSet(mixins.ListModelMixin, mixins.
class ImageViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
"""
Upload image (Save and Run Script)
"""
parser_classes = (JSONParser, MultiPartParser, FormParser,)
queryset = UploadImageTest.objects.all()
serializer_class = ImageSerializer
def output(self, request):
imagename = request.FILES['image']
#imagename = request.data['image']
#imagename = models.ImageField
#imagename = request.FILES['image'].name
#imagename = UploadImageTest.image
print(imagename)
#self.request.FILES['image']
#inp = request.data['image']
inp = request.FILES.get(imagename)
out = run([sys.executable,'//Users/macbookpro//TestAPI//venv//TestImageScript.py',inp],shell=False,stdout=PIPE)
print(out)
return {"status": "Success", "output": str(out)}
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = UploadImageTest
fields = ('id', 'name', 'description', 'image')
class UploadImageTest(models.Model):
permission_classes = (IsAuthenticated,)
name = models.CharField(max_length=200)
description = models.TextField(blank=True)
image = models.ImageField(upload_to="images/", null=True, blank=True)
def __str__(self):
return "{}".format(self.name)
序列化程序.py
class ImageViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
"""
Upload image (Save and Run Script)
"""
parser_classes = (JSONParser, MultiPartParser, FormParser,)
queryset = UploadImageTest.objects.all()
serializer_class = ImageSerializer
def output(self, request):
imagename = request.FILES['image']
#imagename = request.data['image']
#imagename = models.ImageField
#imagename = request.FILES['image'].name
#imagename = UploadImageTest.image
print(imagename)
#self.request.FILES['image']
#inp = request.data['image']
inp = request.FILES.get(imagename)
out = run([sys.executable,'//Users/macbookpro//TestAPI//venv//TestImageScript.py',inp],shell=False,stdout=PIPE)
print(out)
return {"status": "Success", "output": str(out)}
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = UploadImageTest
fields = ('id', 'name', 'description', 'image')
class UploadImageTest(models.Model):
permission_classes = (IsAuthenticated,)
name = models.CharField(max_length=200)
description = models.TextField(blank=True)
image = models.ImageField(upload_to="images/", null=True, blank=True)
def __str__(self):
return "{}".format(self.name)
型号.py
class ImageViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
"""
Upload image (Save and Run Script)
"""
parser_classes = (JSONParser, MultiPartParser, FormParser,)
queryset = UploadImageTest.objects.all()
serializer_class = ImageSerializer
def output(self, request):
imagename = request.FILES['image']
#imagename = request.data['image']
#imagename = models.ImageField
#imagename = request.FILES['image'].name
#imagename = UploadImageTest.image
print(imagename)
#self.request.FILES['image']
#inp = request.data['image']
inp = request.FILES.get(imagename)
out = run([sys.executable,'//Users/macbookpro//TestAPI//venv//TestImageScript.py',inp],shell=False,stdout=PIPE)
print(out)
return {"status": "Success", "output": str(out)}
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = UploadImageTest
fields = ('id', 'name', 'description', 'image')
class UploadImageTest(models.Model):
permission_classes = (IsAuthenticated,)
name = models.CharField(max_length=200)
description = models.TextField(blank=True)
image = models.ImageField(upload_to="images/", null=True, blank=True)
def __str__(self):
return "{}".format(self.name)
Python脚本
file_name = sys.argv[1]
print(file_name)
img = cv2.imread("file_name")
您是否尝试过:
request.FILES.get['image'].filename
根据ImageField的文档,它继承了包含属性filename
(不要忘记在文档中查看此字段的描述)的所有属性
编辑
您可以改为尝试name
attribute:
f = request.FILES['image_url']
print(dir(f)) # This shows everything we can do by using this variable
print("filename : ", f.name)
编辑:
要获得修改后的上传文件名,可以先保存对象,然后检索文件名。您可以尝试以下方法:
(假设有一个名为SomeModel
的模型,并且有一个属性image\u url
,即ImageField)
someModel=someModel.objects.get(id=id)
数据={'image\u url':image\u url}
序列化的_model=SomeModelSerializer(someModel,data=data,partial=True)
如果未序列化,\u model.\u是否有效()
raise ParseError(序列化的_model.errors)
序列化的_model.save()
打印(序列化的_model.data.get('image _url'))#感谢您的回复。但是,它不起作用。也许我还缺少一些东西。谢谢你的支持。request.FILES.get('image')。name打印并获取文件名,但它总是获取“random.png”。Django会自动重命名文件,每次都创建一个唯一的文件名。我无法获取新生成的文件名。它总是抓取“random.png”。