Web Method in Details

Any function or a class method which looks like this can be a web method:

from webpie import Response

class Handler(WPHandler):

    def method(self, request, relpth, **args):
        # ...
        return Response(...)

def method(request, relpth, **args):
    # ...
    return Response(...)

A web method accepts 2 positional arguments:

request - WebOb Request object

relpath - Portion of the request URI left unused after the web method was found (see URI Mapping)

URI query arguments are parsed into the **args key/value portion of the method arguments.

A web method is supposed to return a WebOb Response object. WebPie re-exports WebOb’s Response class, so you can import it from webpie module. For convenience, a web method does not always have to create and return a Response object. WebPie framework accepts web method’s output in many different formats and converts it into a Response object internally. Here are some possibilities and how they are interpreted and converted into a Response:

return types interpretation example equivalent Response object
Response object   Response(“OK”) same - Response(“OK”)
str/bytes response body “hello world” Response(“hello world”)
str/bytes, str body, content type “OK”, “text/plain” Response(“OK”, content_type=”text/plain”)
str/bytes, int body, status “Error”, 500 Response(“Error”, status_code=500)
str/bytes, int, str body, status, content type “Error”, 500, “text/plain” Response(“Error”, status_code=500, content_type=”text/plain”)
str/bytes, dict body, headers “OK”, {“Content-Type”:”text/plain”} Response(“OK”, headers={“Content-Type”:”text/plain”})
str/bytes, int, dict body, status, headers “OK”, 200, {“Content-Type”:”text/plain”} Response(“OK”, status_code=200, headers={“Content-Type”:”text/plain”})
list body iterator [“Hello”,”world”] Response(app_iter=[“Hello”,”world”])
iterable body iterator (x for x in [“hi”,”there”]) Response(app_iter=(x for x in [“hi”,”there”]))
iterable, str body iterator, content type (x for x in “hello”), “text/plain” Response(app_iter=(x for x in “hello”), content_type=”text/plain”)
iterable, int, str body iterator, status, content type lines(), 200, “text/csv”  
iterable, int, dict body iterator, status, headers lines(), 200, {“Content-Type”:”text/csv”, “Cache-Control”:”max-age: 3600”}  

Redirection

A web method can call WPHandler’s redirect method. This method generates a special exception, which is interpreted by WebPie, so you do not have to worry about explicitly ending the web method execution after calling the redirect. For example:

class Handler(WPHandler):

    def main(self, request, relpath):
        if not self.App.user_authenticated(request):
            self.redirect("/login_form")
        # ...

    def login_form(self, request, relpath):
        self.render_to_response("login.html")   # form with action="./authenticate"

    def authenticate(self, request, relpath):
        if self.App.authenticate_user(request):
            self.redirect("./main")
        else:
            self.redirect()