[Grok-dev] JSON method/view name

Martijn Faassen faassen at startifact.com
Fri Oct 9 10:07:56 EDT 2009


Hey,

Marc Rijken wrote:
> I want to use 'getAccounts.json' in the url for a JSON view. Because the 
> method name of a grok.JSON view class will be used as name of the json 
> view and because a method name normally can not contain a dot, I had to 
> make a work around. The work around is:
> 
> class JSONApi(grok.JSON):
>      grok.context(tmx.ITopicMapX)
> 
>      def getAccounts(self):
>          return { "status": "ok"}
> 
>      getAccounts.__name__ = 'getAccounts.json'
> 
> setattr(JSONApi, 'getAccounts.json', JSONApi.getAccounts)
> 
> This work around works ok, but it looks uggly. Is this is preferred way 
> to do so or do you have a better solution?

There's no official better solution. We should look into creating one, 
possibly involving making @grok.name() a decorator that can be used in 
this context.

For a temporary somewhat prettier solution you could make your own 
decorator that sets __name__ and does the setattr too (though I think 
the latter is difficult as you wouldn't have access to the class yet 
unless you resorted to frame hacks, I think).

Alternatively you could create your own grok.View subclass that 
implements its own render() method to handle JSON. You should then be 
able to use grok.name().

Finally you could create an alternative baseclass along the lines of 
grok.JSON and implement your own JSONGrokker that does the name inspection.

If you're up to the challenge you'd be more than welcome to try to get 
this into Grok itself. This applies to anyone else too, of course! I 
think the @grok.name() decorator could be used:

    @grok.name('getAccounts.json)
    def getAccounts(self):
         ....

Reusing a directive as a decorator is tricky however. We have a 
precedent in grok.require, but it isn't the easiest thing to get going. 
It'd be nice if we had more general infrastructure to accomplish this in 
Martian.

Regards,

Martijn



More information about the Grok-dev mailing list