Re: CorePost - a tiny Flask-style REST microframework for twisted.web

Jacek Furmankiewicz <[email protected]>
Newsgroups gmane.comp.python.twisted.web
Message-ID <CAGDztiGkN8JAJUjXSVTpodJNURUaDWwiJMx7ndAw+Rb8iSBCUw@mail.gmail.com>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.