I have a page that is supposed to answer with json if the caller sends 
"Accept: application/json" and with a html page if the accept header is 
anything else.

It sound like I should be able to do something like below according to the 
documentation<http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/config.html#pyramid.config.Configurator.add_view>
 but 
I can't get it to work.
    @view_config(route_name='overview',
                 accept='*/*',
                 renderer='overview.mak')
    @view_config(route_name='overview',
                 accept='application/json',
                 renderer='grid-data')
    def overview(self):
        return dict(grid=OverviewGrid(self.request))

If I do 
     @view_config(route_name='overview',
                 accept='*/*',
                 renderer='overview.mak')
    def overview(self):
        return dict(grid=OverviewGrid(self.request))
Pyramid/Webob, acceptparse:322 throws a exception with the message "The 
application should offer specific types, got */*" so it sound like the 
documentation is incorrect. 

I also tried 
    @view_config(route_name='overview',
                 renderer='overview.mak')
    @view_config(route_name='overview',
                 accept='application/json',
                 renderer='grid-data')
    def overview(self):
        return dict(grid=OverviewGrid(self.request))
But then the only match I get is application/json.

This almost does what I want.
    @view_config(route_name='overview',
                 accept="text/html",
                 renderer='overview.mak')
    @view_config(route_name='overview',
                 accept='application/json',
                 renderer='grid-data')
    def overview(self):
        return dict(grid=OverviewGrid(self.request))
This hits every normal webbrowser except for IE8+ which sends "Accept: 
image/gif, image/jpeg, image/pjpeg, image/pjpeg, 
application/x-shockwave-flash, */*".

I have tried with both Chrome 
("Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") 
and IE8 ("Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, 
application/x-shockwave-flash, */*") and I can't get it to work.

I took a peek at the Pyramid code and at line 556 in config/views.py 
anything with accept == None or with a '*' in it gets added to the 
self.view list while anything with something else in the accept parameter 
gets added to the self.accepts list.

Later on when get_views gets called it creates a list using the 
self.accepts list in the order of the best match. Afterwards it adds the 
self.views list to the end of the list and returns that, the code then 
tries to call each view in the list until it succeeds. 

This means that as long as there is any other view_config with a accept 
parameter with the same route_name and if the webbrowser send '*/*' in the 
accept list then there is no way to have a general accept='*/*' view since 
'*/*' gets filtered by the code and best_match always returns the other 
view_config with a accept parameter.

If I change pyramid/config/views.py:559 from "if accept is None or '*' in 
accept:" to "if accept is None or '*' == accept:" and add a "return" 
in WebOb/acceptparse.py:320 then everything works as I expected it to.

Did I miss something or is there currently no way to do what I want without 
changing both Pyramid and WebOb?

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/pylons-discuss/-/bKI_JlNV_04J.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en.

Reply via email to