Форум сайта python.su
Доброго времени суток
Подскажите как правильно сделать проверку и подмену файла при загрузке.
Используеться Django. В поле filefield загружаеться файл в фомате JSON, который должен содержать массив чисел.
Содержимое файла проверяеться на соответсвие и форматируеться. Как записать уже отформатированные данные в файл вместо старых и сохранить. Либо создать новый файл с отформатированными данными и заменить им полученный из запроса.
Делаю проверку в методе clean поля.
def clean_data(self): import numpy as np MAX_FILE_SIZE = 200 * 1024 * 1024 file = self.cleaned_data['data'] file_size = file.size if file_size > MAX_FILE_SIZE: raise forms.ValidationError("Very large file") raw_data = file.read().decode('utf-8') # json_2d_array_of_int32 = np.fromstring(raw_data) try: json_data = json.loads(raw_data) except (TypeError, ValueError): raise forms.ValidationError("Incorrect JSON format") else: json_2d_array_of_int32 = np.array(json_data) json_data = None data_dtype = json_2d_array_of_int32.dtype data_shape = json_2d_array_of_int32.shape datacorrect = ( ( data_dtype == np.dtype('int32') or data_dtype == np.dtype('float64') ) and len(data_shape) == 2 ) if not datacorrect: raise forms.ValidationError("Incorrect data format!" "Try file with JSON array_of_arrays-like structure") # Как тут правильно сделать подмену. # outfile = TemporaryFile() np.save('temp_json', json_2d_array_of_int32) # print(type(np.array2string(json_2d_array_of_int32))) print(np.array_str(json_2d_array_of_int32)[1:-1]) return file
Офлайн
советую познакомиться c json schema и валидировать через неё, для начала
на счёт подмены, обычно в pre_save() методе делается (только это поля модели, а не формы)
например в DateTimeField используется: https://github.com/django/django/blob/1.10.3/django/db/models/fields/__init__.py#L1253
если в форме, то всё верно, переопределяете clean_<fieldname> и модифицируете на лету
или вопрос как UploadedFile модифицировать?
Отредактировано slav0nic (Ноя. 16, 2016 21:07:06)
Офлайн