Components
==========
Components are pieces of functionality that can be invoked by a handler or react to handler events. Components are a great way to re-use code between controllers, such as with pagination, searching, emailing, etc.
Using Components
----------------
Import your desired components and include them in the ``components`` property on your handler, like so::
from ferris.components.pagination import Pagination
from ferris.components.json import Json
class Documents(Handler):
components = [Pagination, Json]
Inside of your actions, you can access the component instances using ``self.components``::
def list(self):
self.components.pagination.paginate()
Built-in Components
-------------------
.. module:: ferris.components
The :mod:`ferris.components` provides a few built-in components. These can be used directly, customized, or used as guidelines when building your own.
Pagination
~~~~~~~~~~
.. autoclass:: ferris.components.pagination.Pagination
.. automethod:: ferris.components.pagination.Pagination.paginate
For example of using this, see :doc:`../tutorial/7_extras`
Email
~~~~~
.. autoclass:: ferris.components.email.Email
.. automethod:: ferris.components.email.Email.send
.. automethod:: ferris.components.email.Email.send_template
For example::
from ferris.core.handler import Handler
from ferris.components.email import Email
class Example(Handler):
components = [Email]
def list(self):
self.set(text="Hello!")
self.components.email.send_template(
recipient="test@example",
subject="Test Email",
template="emails/test.html")
Assuming you have a template at ``emails/test.html``.
JSON
~~~~
.. autoclass:: ferris.components.json.Json
For example::
from ferris.core.handler import Handler, scaffold
from ferris.components.json import Json
@scaffold
class Posts(Handler):
components = [Json]
@scaffold
def list(self):
pass
In this example, making a request to http://localhost:8080/posts will render an HTML template of all posts, but making a request to http://localhost:8080/posts?alt=json will return the list of posts as JSON.
Upload
~~~~~~
The :class:`Upload` component can take the guesswork out of using the `Blobstore API `_ to upload binary files. It works with :doc:`forms` and :doc:`models`.
.. autoclass:: ferris.components.upload.Upload
A simple example::
from ferris.core.ndb import Model, ndb
from ferris.core.handler import Handler, scaffold
from ferris.components.upload import Upload
class Picture(Model):
file = ndb.BlobKeyProperty()
@scaffold
class Pictures(Handler):
components = [Upload]
Search
~~~~~~
The :class:`Search` component makes it really use to use the `Search API `_.
In order to use search, you must first :func:`index` your models:
.. autofunction:: ferris.components.search.index
Be sure to unindex when an item is deleted or no longer needed:
.. autofunction:: ferris.components.search.unindex
With documents in the search index you can use the search component:
.. autoclass:: ferris.components.search.Search
.. automethod:: ferris.components.search.Search.search
For example of using this, see :doc:`../tutorial/7_extras`