Web Method in Details
=====================
Any function or a class method which looks like this can be a web method:
.. code-block:: python
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, Response("OK", status_code=200,
{"Content-Type":"text/plain"} 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, lines(), 200, "text/csv"
content type
iterable, int, dict body iterator, status, lines(), 200,
headers {"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:
.. code-block:: python
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()