On Sun, 2011-01-09 at 16:25 -0800, lost_rat wrote:
> Branching from within view_handler
> 
> from pyramid.response import Response
> from pyramid.httpexceptions import HTTPRedirection
> from pyramid.httpexceptions import HTTPFound
> class MyViewHandler(object):
>     __autoexpose__ = None
>     def __init__(self, request):
>         self.request = request
>     @action(renderer='/index.mako')
>     def index(self):
>         if test():
>             return {}
>         elif test2():
>             return Response('good stuff')
>         elif test3():
>             return HTTPRedirection(location='http://localhost/index3')
>         else:
>             return HTTPFound(location='http://localhost/index4')
> 
> 
> In Pylons I could conditionally branch based on GET versus POST, where
> the URL would be identical. I would transform the data from a POST
> into a modified URL and redirect. I can't seem to accomplish the same
> thing here within Pyramid.
> 
> The Response works, but not HTTPRedirection or HTTPFound.

You have a number of problems here.

First, HTTPRedirection is not a response object that will behave in any
sensible way; it's a base class for both HTTPFound and HTTPSeeOther, or
HTTPMovedPermanently which are the "right" classes to use in user code.

You say that HTTPFound "doesn't work", but I suspect it does, and your
code is not reaching it somehow.

All that said, rather than branch within a single action method, you can
use view predicates to break the branches into separate methods.  If
test(), test2() and test3() are notational proxies for checking the
request method above (say, test() means request_method=='GET', test2()
is request_method=='POST' and test3() is request_method=='HEAD', the
following code would be more Pyramidic:

from pyramid.response import Response
from pyramid.httpexceptions import HTTPRedirection
from pyramid.httpexceptions import HTTPFound

class MyViewHandler(object):

    __autoexpose__ = None

    def __init__(self, request):
        self.request = request

    @action(renderer='/index.mako', request_method='GET')
    def index_GET(self):
        return {}

    @action(request_method='POST')
    def index_POST(self):
        return Response('good stuff')

    @action(request_method='HEAD')
    def index_HEAD(self):
        return HTTPRedirection(location='http://localhost/index3')

    @action()
    def index_OTHER(self):
        return HTTPFound(location='http://localhost/index4')

There are predicates other than "request_method" usable in view
configuration decorators like view_config and action (see
http://docs.pylonshq.com/pyramid/dev/narr/viewconfig.html#predicate-arguments). 
 You can even create your own predicates by using "custom_predicates".

Of course you can still do it the single-view-with-branching way, you
just need to get your return values correct.

See also http://plope.com/weird_pyramid_urldispatch

- C



-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
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.

Reply via email to