Unfortunately WebOb matches "application/json" with the last "*/*" of the browsers accept string. I wonder if I could use @view_config(route_name="foo" accept="a") or something that always would end up as the best match of '*/*'. I will have to try that.
On Tuesday, August 14, 2012 3:49:07 PM UTC+2, Gael Pasgrimaud wrote: > > On 14/08/2012 15:35, Mattias wrote: > > 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)) > > What about: > > @view_config(route_name='overview', > accept='application/json', > renderer='grid-data') > @view_config(route_name='overview', > renderer='overview.mak') > def overview(self): > return dict(grid=OverviewGrid(self.request)) > > I guess that if the first one doesn't match then the second is used. > > > 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]<javascript:>. > > > To unsubscribe from this group, send email to > > [email protected] <javascript:>. > > 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 view this discussion on the web visit https://groups.google.com/d/msg/pylons-discuss/-/h6XjpA0O3YQJ. 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.
