同样,我仍在学习python,因此请和我一起裸照。我想这样做是Django REST框架和文件上传(数据URI)
1)允许用户选择图像 2)获得的图像,并将其添加到画布 3)允许处理(重新调整大小)的canavs 4)推内“上传” 5)采取的帆布和生成数据URI关闭它
这一切工作的花花公子在JS留下我有三个隐藏字段:
<input type="hidden" id="imageData" name="imageData" />
<input type="hidden" id="imageName" name="imageName" />
<input type="hidden" id="imageCaption" name="imageCaption" />
这里是Python代码
class Image(models.Model):
filePath = models.CharField(max_length=200)
imageCaption = models.CharField(max_length=200)
imageName = models.CharField(max_length=200)
class ImageSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Image
fields = ('filePath', 'imageCaption','imageName')
class ImageViewSet(viewsets.ModelViewSet):
queryset = Image.objects.all()
serializer_class = ImageSerializer
我错过了一些关键点。
1)我在哪里/如何拦截剩余请求来解析/处理传入的REST帖子,以便能够分离数据URI并将映像存储在磁盘上?
2)我也许不明白一堆这一点 - 因此,如果有别的我失去了一些东西,请让我知道
我认为,关键是在覆盖串行恢复领域的方法。当它查找由file.FileField构建的“file”字段时,我需要重定向框架以查找dataUri字段,该字段是要通过的字段,但我需要实例化一个新字段,其中没有限制最大长度。将dataUri分开,存储文件,并将文件字段添加到解析资源的字典中,并让框架按计划继续。在这种情况下,重写pre_save并不是必需的,因为这些代码需要在验证之前执行。
JS:
// angularJs controller submit method, using RESTAngular
$scope.submit = function() { //function(event) {
var someImg = {
file: ''
, dataUri: $scope.fileUrl
, caption: $scope.caption
}
ImagesResource.post(someImg)
}
的Python:
class ImageSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Image
fields = ('file', 'caption','id')
def saveImage(self, imgFileUri):
#parse dataUri and save locally, return local path
return 'somewhereOverTheBlah'
def restore_fields(self, data, files):
"""
Core of deserialization, together with `restore_object`.
Converts a dictionary of data into a dictionary of deserialized fields.
"""
reverted_data = {}
if data is not None and not isinstance(data, dict):
self._errors['non_field_errors'] = ['Invalid data']
return None
for field_name, field in self.fields.items():
print('a: ' + field_name)
if(field_name == 'file'):
field_name = 'dataUri'
field = fields.CharField()
try:
# restore using the built in mechanism
field.field_from_native(data, files, field_name, reverted_data)
# take the dataUri, save it to disk and return the Path
value = reverted_data[field_name]
path = self.saveImage(value)
# set the file <Path> property on the model, remove the old dataUri
reverted_data['file'] = path
del reverted_data[field_name]
except ValidationError as err:
self._errors[field_name] = list(err.messages)
else:
field.initialize(parent=self, field_name=field_name)
try:
field.field_from_native(data, files, field_name, reverted_data)
except ValidationError as err:
self._errors[field_name] = list(err.messages)
return reverted_data
谢谢我使用传统的Web POST实现类似的东西。转向基于REST的方法 - 并将数据发送出去很困难。在这种情况下,我不需要持续处理数据,它工作正常。但在这种情况下,我想将文件保存到FS(而不是数据库),在这种情况下,我需要在正确的位置挂入DJANGO REST FRAMEWORK ... – akaphenom
感谢您的表单链接。今天下午肯定会阅读。 – akaphenom