| | |
| | | |
| | | The starter files generated by the ``zodb`` scaffold are basic, but |
| | | they provide a good orientation for the high-level patterns common to most |
| | | :term:`traversal` -based :app:`Pyramid` (and :term:`ZODB` based) projects. |
| | | :term:`traversal` -based :app:`Pyramid` (and :term:`ZODB` -based) projects. |
| | | |
| | | |
| | | Application Configuration with ``__init__.py`` |
| | |
| | | |
| | | A directory on disk can be turned into a Python :term:`package` by containing |
| | | an ``__init__.py`` file. Even if empty, this marks a directory as a Python |
| | | package. Our application uses ``__init__.py`` as both a package marker, as |
| | | well as to contain application configuration code. |
| | | package. Our application uses ``__init__.py`` both as a package marker and |
| | | to contain application configuration code. |
| | | |
| | | When you run the application using the ``pserve`` command using the |
| | | ``development.ini`` generated config file, the application configuration |
| | |
| | | |
| | | #. *Lines 1-3*. Perform some dependency imports. |
| | | |
| | | #. *Lines 6-8* Define a root factory for our Pyramid application. |
| | | #. *Lines 6-8*. Define a root factory for our Pyramid application. |
| | | |
| | | #. *Line 14*. We construct a :term:`Configurator` with a :term:`root |
| | | factory` and the settings keywords parsed by :term:`PasteDeploy`. The root |
| | | factory is named ``root_factory``. |
| | | |
| | | #. *Line 15*. Register a 'static view' which answers requests which start |
| | | with URL path ``/static`` using the |
| | | #. *Line 15*. Register a "static view" which answers requests whose URL path |
| | | start with ``/static`` using the |
| | | :meth:`pyramid.config.Configurator.add_static_view method`. This |
| | | statement registers a view that will serve up static assets, such as CSS |
| | | and image files, for us, in this case, at |
| | |
| | | will be ``/static``. The second argument of this tag is the "path", |
| | | which is a relative :term:`asset specification`, so it finds the resources |
| | | it should serve within the ``static`` directory inside the ``tutorial`` |
| | | package. The scaffold could have alternately used an *absolute* asset |
| | | specification as the path (``tutorial:static``) but it does not. |
| | | package. Alternatively the scaffold could have used an *absolute* asset |
| | | specification as the path (``tutorial:static``). |
| | | |
| | | #. *Line 16*. Perform a :term:`scan`. A scan will find :term:`configuration |
| | | decoration`, such as view configuration decorators (e.g. ``@view_config``) |
| | | decoration`, such as view configuration decorators (e.g., ``@view_config``) |
| | | in the source code of the ``tutorial`` package and will take actions based |
| | | on these decorators. We don't pass any arguments to |
| | | :meth:`~pyramid.config.Configurator.scan`, which implies that the scan |
| | | should take place in the current package (in this case, ``tutorial``). |
| | | The scaffold could have equivalently said ``config.scan('tutorial')`` but |
| | | The scaffold could have equivalently said ``config.scan('tutorial')``, but |
| | | it chose to omit the package name argument. |
| | | |
| | | #. *Line 17*. Use the |
| | |
| | | :term:`domain model` of the application, because each resource is a node |
| | | stored persistently in a :term:`ZODB` database. The ``models.py`` file is |
| | | where the ``zodb`` scaffold put the classes that implement our |
| | | resource objects, each of which happens also to be a domain model object. |
| | | resource objects, each of which also happens to be a domain model object. |
| | | |
| | | Here is the source for ``models.py``: |
| | | |
| | |
| | | :language: py |
| | | |
| | | #. *Lines 4-5*. The ``MyModel`` :term:`resource` class is implemented here. |
| | | Instances of this class will be capable of being persisted in :term:`ZODB` |
| | | Instances of this class are capable of being persisted in :term:`ZODB` |
| | | because the class inherits from the |
| | | :class:`persistent.mapping.PersistentMapping` class. The ``__parent__`` |
| | | and ``__name__`` are important parts of the :term:`traversal` protocol. |
| | |
| | | indeed if you look in the ``templates`` directory of this package, you'll |
| | | see a ``mytemplate.pt`` template file, which renders the default home page |
| | | of the generated project. This asset specification is *relative* (to the |
| | | view.py's current package). We could have alternately an used the |
| | | view.py's current package). Alternatively we could have used the |
| | | absolute asset specification ``tutorial:templates/mytemplate.pt``, but |
| | | chose to use the relative version. |
| | | |