returning 204s for DELETE, webtest complains that there is content

108 views
Skip to first unread message

Iain Duncan

unread,
Jul 27, 2012, 4:21:01 PM7/27/12
to pylons-...@googlegroups.com
Hi, I'm implementing a set of views to return json to work with Dojo object stores. From what I can gather, Dojo best wants me to return a 204 status after a successful delete. 
The view is registered as using the json renderer. It changes the response status to 204 and returns None to the json renderer (or an empty dict, I've tried both). Web test however is throwing an assertion error with the message that there is content with my 204 response.

The call in my webtest test:

res = self.app.delete('/json/person/%i' % item.id, status=204)

The view code that I hoped would work:

class JsonItemDeleteView(JsonView):
    def __call__(self):
        try:
            self.model.delete_obj(self.context)
            self.request.response.status = '204 No Content'
            # status 204 means there should be *no* response body
            return None
        except Exception, e:
            log.info("Error deleting %s, %s" % (self.context, e) )
            json_dict = {}
            self.request.response.status = '500 Internal Server Error'
            json_dict['error'] = 'Error: The item was not able to be deleted'
            return json_dict

Traceback:
 File "/home/xornot/trunk/DojoSkunk/eggs/WebTest-1.3.4-py2.7.egg/webtest/lint.py", line 443, in check_content_type
    "which must not return content.") % code)
AssertionError: Content-Type header found in a 204 response, which must not return content.


Any help greatly appreciated!
iain

Gael Pasgrimaud

unread,
Jul 27, 2012, 4:26:14 PM7/27/12
to pylons-...@googlegroups.com
On 27/07/2012 22:21, Iain Duncan wrote:
> Hi, I'm implementing a set of views to return json to work with Dojo
> object stores. From what I can gather, Dojo best wants me to return a
> 204 status after a successful delete.
> The view is registered as using the json renderer. It changes the
> response status to 204 and returns None to the json renderer (or an
> empty dict, I've tried both). Web test however is throwing an assertion
> error with the message that there is content with my 204 response.

Try to return pyramid.httpexceptions.HTTPNoContent()

>
> The call in my webtest test:
>
> res = self.app.delete('/json/person/%i' % item.id <http://item.id>,
> status=204)
>
> The view code that I hoped would work:
>
> class JsonItemDeleteView(JsonView):
> def __call__(self):
> try:
> self.model.delete_obj(self.context)
> self.request.response.status = '204 No Content'
> # status 204 means there should be *no* response body
> return None
> except Exception, e:
> log.info <http://log.info>("Error deleting %s, %s" % (self.context, e) )
> json_dict = {}
> self.request.response.status = '500 Internal Server Error'
> json_dict['error'] = 'Error: The item was not able to be
> deleted'
> return json_dict
>
> Traceback:
> File
> "/home/xornot/trunk/DojoSkunk/eggs/WebTest-1.3.4-py2.7.egg/webtest/lint.py",
> line 443, in check_content_type
> "which must not return content.") % code)
> AssertionError: Content-Type header found in a 204 response, which must
> not return content.
>
>
> Any help greatly appreciated!
> iain
>
> --
> You received this message because you are subscribed to the Google
> Groups "pylons-discuss" group.
> To post to this group, send email to pylons-...@googlegroups.com.
> To unsubscribe from this group, send email to
> pylons-discus...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/pylons-discuss?hl=en.

Iain Duncan

unread,
Jul 27, 2012, 4:30:43 PM7/27/12
to pylons-...@googlegroups.com
On Fri, Jul 27, 2012 at 1:26 PM, Gael Pasgrimaud <ga...@gawel.org> wrote:
On 27/07/2012 22:21, Iain Duncan wrote:
Hi, I'm implementing a set of views to return json to work with Dojo
object stores. From what I can gather, Dojo best wants me to return a
204 status after a successful delete.
The view is registered as using the json renderer. It changes the
response status to 204 and returns None to the json renderer (or an
empty dict, I've tried both). Web test however is throwing an assertion
error with the message that there is content with my 204 response.

Try to return pyramid.httpexceptions.HTTPNoContent()


Thanks Gael. Is that considered better practice than doing the following, which also makes it pass but seems hacky? I'm worried that if I raise HTTPNoContent, is it a text/json reponse? Or is that a non issue because it's a 204? ( ie are json 204s and html 204s identical? )

my hacky fix:
 self.request.response.status = '204 No Content'
 self.request.response.headers.pop('Content-Type')
 return None

thanks
Iain

Gael Pasgrimaud

unread,
Jul 27, 2012, 4:46:39 PM7/27/12
to pylons-...@googlegroups.com
On 27/07/2012 22:30, Iain Duncan wrote:
>
> On Fri, Jul 27, 2012 at 1:26 PM, Gael Pasgrimaud <ga...@gawel.org
> <mailto:ga...@gawel.org>> wrote:
>
> On 27/07/2012 22:21, Iain Duncan wrote:
>
> Hi, I'm implementing a set of views to return json to work with Dojo
> object stores. From what I can gather, Dojo best wants me to
> return a
> 204 status after a successful delete.
> The view is registered as using the json renderer. It changes the
> response status to 204 and returns None to the json renderer (or an
> empty dict, I've tried both). Web test however is throwing an
> assertion
> error with the message that there is content with my 204 response.
>
>
> Try to return pyramid.httpexceptions.__HTTPNoContent()
>
>
>
> Thanks Gael. Is that considered better practice than doing the
> following, which also makes it pass but seems hacky? I'm worried that if
> I raise HTTPNoContent, is it a text/json reponse? Or is that a non issue
> because it's a 204? ( ie are json 204s and html 204s identical? )
>

That's a non issue because if you don't have a content you don't need a
content-type. And you should not have one. This is why webtest raise.

> my hacky fix:
> self.request.response.status = '204 No Content'
> self.request.response.headers.pop('Content-Type')
> return None
>

I guess the result is the same. But you can just return a Response
instance. eg: HTTPNoContent(). No need to raise it.

> thanks
> Iain

Iain Duncan

unread,
Jul 30, 2012, 1:17:28 PM7/30/12
to pylons-...@googlegroups.com
Thanks for the clarification.

iain

thanks
To post to this group, send email to pylons-discuss@googlegroups.com.

To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/pylons-discuss?hl=en.
--
You received this message because you are subscribed to the Google Groups "pylons-discuss" group.
To post to this group, send email to pylons-discuss@googlegroups.com.
To unsubscribe from this group, send email to pylons-discuss+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages