Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File posting via RESTful api with django and tastypie

i am creating an RESTful api for a Django website. I am using tastypie for doing it. My problem is i could'nt design how to post images or files via this api. I mean, to create an object on database we are posting data in json format. But how can i put a file inside that json?

I found that there is two methods one of them is converting them Base64 format. I don't want to use it because in my tests, image which is 74kb is being 110kb-120kb when converted to Base64.

So can anybody explain me how can i post an object that contains files inside it?

like image 598
Mirat Can Bayrak Avatar asked Aug 25 '11 16:08

Mirat Can Bayrak


2 Answers

Look here: https://github.com/toastdriven/django-tastypie/issues/42

Looks like there were approaches todo that, but aren't working quite well.

After a long time playing around with various solutions ( https://github.com/klipstein/django-tastypie/commit/e0f86ddffeb46c77704328a3b5899ec08e18e4eb, https://github.com/klipstein/django-tastypie/commits/form-data) doing file-handling within tastypie I came to the conclusion that this can't be solved elegantly if you want to support file uploads from every browser.

Have a look on this fork

https://github.com/ff0000/django-tastypie/commit/1fbc0a

like image 153
seb Avatar answered Nov 11 '22 06:11

seb


Serializing the file into the JSON request is a slightly awkward way to do things, and also is going to mean you lose some of Django's file upload automatic niceness, eg writing the file to memory as the request comes in, and only switching to writing it to disk once it gets above a certain size.

For the file upload view you might want to drop out of tastypie, and write the view explicitly.

Then you could either use a standard multipart form, (and just access the file using request.FILES as usual, or (more complicated), create a view that will accept the raw file content.

like image 36
Tom Christie Avatar answered Nov 11 '22 05:11

Tom Christie