D'oh. Finally found how to do it. I can use the decorator to attach additional route-specific attributes to the function and then the class instance can scan for it from the constructor, auto-registering each of its own methods that have route info attached to them.
Sorry for previous question Jacek On Mon, Sep 5, 2011 at 12:14 PM, Jacek Furmankiewicz <[email protected]>wrote: > Hi Glyph, > > I looked at your suggestion, but unfortunately the implementation is very > complex, if not impossible. > > The main problem is that > a) a class method with a decorator "forgets" its class, so it's impossible > from the decorator which class it belongs to. > The function has not been bound to a class yet when the decorator is called > for the first time, so there is no way for it to notify the containing class > that this function defines a route for it > > b) is is next to impossible for a class to scan its own function and find > their decorators. I've seen some hacks on StackOverflow > where it actually parses the source code, but that is an ugly hack to say > the least (and probably prone to many bugs) > > In general, it seems decorators on class methods are missing such crucial > functionality as finding out which class the method belongs to. > Sort of a key requirement, if you ask me (at least after lots of experience > with Java or .Net reflection, where getting this sort of info is trivial). > > if you have any suggestions on how to accomplish your recommendation, I > would greatly appreciate it. > > The decorator in question that I would need to take out of the CorePost > class and make it a standalone function looks like this: > > def > route(self,url,methods=(Http.GET,),accepts=MediaType.WILDCARD,produces=None,cache=True): > """Main decorator for registering REST functions """ > def wrap(f,*args,**kwargs): > self.__registerFunction(f, url, methods, accepts, > produces,cache) > return f > return wrap > > it's obtaining the reference to 'self' when it is not a class method any > more is the problem. Not sure how to get around it. > > Cheers, > Jacek > > On Sun, Sep 4, 2011 at 12:01 AM, Glyph Lefkowitz > <[email protected]>wrote: > >> >> On Sep 3, 2011, at 8:28 PM, Jacek Furmankiewicz wrote: >> >> Any feedback is welcome >> >> >> Hi Jacek, >> >> Great to see more development going into Twisted-based web stuff! :) >> >> However, I do have one question. Maybe I'm missing something about the >> way Flask does things, but it seems very odd to me that the decorators >> you're using are applied to global functions, rather than instances of an >> object. For example, instead of: >> >> app = CorePost() >> ... >> @app.route("/validate/<int:rootId>/schema",Http.POST) >> @validate(schema=TestSchema) >> def postValidateSchema(request,rootId,childId,**kwargs): >> '''Validate using a common schema''' >> return "%s - %s - %s" % (rootId,childId,kwargs) >> >> >> You could do: >> >> class MyPost(CorePost): >> @route("/validate/<int:rootId>/schema",Http.POST) >> @validate(schema=TestSchema) >> def postValidateSchema(self,request,rootId,childId,**kwargs): >> '''Validate using a common schema''' >> return "%s - %s - %s" % (rootId,childId,kwargs) >> >> >> This would allow for re-usable objects; for example, rather than having a >> "blog article create" API (sorry for the uninspired example, it's late) for >> your entire site, you would have a "article create" API on a "Blog", which >> would enable you to have multiple Blog objects (perhaps with different >> authors, in different permission domains, etc). This would also make >> re-using the relevant objects between different applications easier. >> >> In other words, global variables are bad, and this looks like it depends >> rather heavily on them. >> >> Any thoughts on this? Am I missing the point? >> >> Thanks, >> >> -glyph >> >> >> _______________________________________________ >> Twisted-web mailing list >> [email protected] >> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web >> >> >
_______________________________________________ Twisted-web mailing list [email protected] http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
