我想做的是
1) 允许用户选择图像 2) 获取图像并将其添加到画布 3) 允许在画布内部进行操作(重新调整大小) 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)我可能不明白这一点 - 所以如果还有其他我遗漏的东西,请告诉我
我认为诀窍在于覆盖序列化程序恢复字段方法。当它查找由model.FileField构建的“文件”字段时,我需要重定向框架以查找作为传递字段的dataUri字段,但我需要实例化一个新字段,没有最大长度的限制。将dataUri拉开,存储文件,将file字段添加到解析资源的字典中,让框架按计划继续。在这种情况下,不需要覆盖 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