简体   繁体   中英

Python (tastypie) - Bad request on POST, returns “error” dict

I'm trying to send data to my Django-powered server using Tastypie.

I have this model

class Open(models.Model):
    name=models.TextField()

and this URLconf

open_resource=OpenResource()

urlpatterns = patterns('',
    url(r'^api/', include(open_resource.urls)),
    url(r'^admin/', include(admin.site.urls)),
)

when I run the tastypie curl command

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"name","awdawd"}' http://localhost:8000/api/open/

I get the error

HTTP/1.0 400 BAD REQUEST
Date: Sat, 05 Apr 2014 12:18:48 GMT
Server: WSGIServer/0.1 Python/2.7.3
X-Frame-Options: SAMEORIGIN
Content-Type: application/json

{"error": ""}

I've tried everything and can't seem to get this working.

Does anyone have a clue on this one?

Thanks a lot in advance

I get this unhelpful error whenever I provide invalid JSON data .

Correct JSON format is:

{"foo": "bar"}                     // correct!

[{"foo": "bar"}, {"fiz": "baz"}]   // correct!

{"foo": "bar", "fiz": "baz"}       // correct!

Examples of common mistakes :

{'foo': 'bar'}    // error is using single quotes instead of double quotes
{foo: "bar"}      // error is not using double quotes for "foo"
{"foo", "bar"}    // error is using a comma (,) instead of a colon (:)  ← Your error

Examples of more complex mistakes :

[{"foo": "bar"}, {"fiz": "baz"},]
// error is using a comma at the end of a list or array

{"foo": "bar", "fiz": "baz",}  // courtesy @gthmb
// error is using a comma at the end of the final key-value pair

Think your JSON is valid? Double-check with a JSON validator .

As tastypie works with JSON data you have to provide also this format. Try this as data:

--data '{"name": "myName"}'

Also I'm not sure how you build your urls, but I can show you a working url set up:

v1_api = Api(api_name='v1')
v1_api.register(OpenResource())
urlpatterns = patterns('',
url(r'^api/', include(v1_api.urls)),
...
}

This would create the following url to access your resource:

/api/v1/open/?format=json

This would finally come to this curl command:

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"name": "myName"}' http://localhost:8000/api/v1/open/

And don't forget to add the authorisation and authentication in your metadata of your resource

OpenResource(ModelResource)
    class Meta:
    queryset = Open.objects.all()
    authorization = Authorization()  

As by default tastypie sets up a resource with the ReadOnlyAuthorization, which forbids post, put access.

For more information read the docs: https://django-tastypie.readthedocs.org

Hopefully this helped, cheers!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM