[Twisted-web] CorePost - a tiny Flask-style REST microframework for twisted.web
Jacek Furmankiewicz
jacek99 at gmail.com
Mon Sep 5 12:41:39 EDT 2011
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 <jacek99 at gmail.com>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 <glyph at twistedmatrix.com>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
>> Twisted-web at twistedmatrix.com
>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-web/attachments/20110905/94453cb2/attachment.htm
More information about the Twisted-web
mailing list