Chris McDonough
2010-11-10 a3ceb6cea0bad0ecd526a8033d7baf8465de9872
fix project chapter to deal with paster template changes
7 files modified
417 ■■■■ changed files
docs/narr/MyProject/development.ini 12 ●●●●● patch | view | raw | blame | history
docs/narr/MyProject/myproject/__init__.py 7 ●●●● patch | view | raw | blame | history
docs/narr/MyProject/myproject/static/pylons.css 7 ●●●● patch | view | raw | blame | history
docs/narr/MyProject/myproject/templates/mytemplate.pt 104 ●●●● patch | view | raw | blame | history
docs/narr/MyProject/setup.py 9 ●●●●● patch | view | raw | blame | history
docs/narr/project.rst 275 ●●●● patch | view | raw | blame | history
pyramid/paster_templates/starter/+package+/__init__.py_tmpl 3 ●●●●● patch | view | raw | blame | history
docs/narr/MyProject/development.ini
@@ -1,14 +1,16 @@
[DEFAULT]
debug = true
[app:main]
use = egg:MyProject#app
[app:MyProject]
use = egg:MyProject
reload_templates = true
debug_authorization = false
debug_notfound = false
debug_templates = true
default_locale_name = en
[pipeline:main]
pipeline =
    egg:WebError#evalerror
    MyProject
[server:main]
use = egg:Paste#http
host = 0.0.0.0
docs/narr/MyProject/myproject/__init__.py
@@ -1,11 +1,8 @@
from pyramid.configuration import Configurator
from myproject.models import get_root
def app(global_config, **settings):
    """ This function returns a WSGI application.
    It is usually called by the PasteDeploy framework during
    ``paster serve``.
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(root_factory=get_root, settings=settings)
    config.begin()
docs/narr/MyProject/myproject/static/pylons.css
@@ -43,14 +43,15 @@
body h4,
body h5,
body h6{font-family:"Nobile","Lucida Grande",Lucida,Verdana,sans-serif;font-weight:normal;color:#144fb2;font-style:normal;}
#wrap {min-height: 100%;}
#header,#footer{width:100%;color:#ffffff;height:40px;position:absolute;text-align:center;line-height:40px;overflow:hidden;font-size:12px;}
#header{background-color:#e88f00;top:0;font-size:14px;}
#footer{background-color:#000000;bottom:0;}
#footer{background-color:#000000;bottom:0;position: relative;margin-top:-40px;clear:both;}
.header,.footer{width:700px;margin-right:auto;margin-left:auto;}
.wrapper{width:100%}
#top,#bottom{width:100%;}
#top{color:#888;background-color:#eee;height:300px;border-bottom:2px solid #ddd;}
#bottom{color:#222;background-color:#ffffff;}
#bottom{color:#222;background-color:#ffffff;overflow:hidden;padding-bottom:80px;}
.top,.bottom{width:700px;margin-right:auto;margin-left:auto;}
.top{padding-top:100px;}
.app-welcome{margin-top:25px;}
@@ -68,3 +69,5 @@
input{color:#222;border:1px solid #ccc;font-family:sans-serif;font-size:12px;line-height:16px;}
input[type=text]{}
input[type=submit]{background-color:#ddd;font-weight:bold;}
/*Opera Fix*/
body:before {content:"";height:100%;float:left;width:0;margin-top:-32767px;}
docs/narr/MyProject/myproject/templates/mytemplate.pt
@@ -8,57 +8,67 @@
    <link rel="shortcut icon" href="${request.application_url}/static/favicon.ico" />
    <link rel="stylesheet" href="${request.application_url}/static/pylons.css" type="text/css" media="screen" charset="utf-8" />
    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Nobile:regular,italic,bold,bolditalic&amp;subset=latin" type="text/css" media="screen" charset="utf-8" />
    <!--[if !IE 7]>
    <style type="text/css">
        #wrap {display:table;height:100%}
    </style>
    <![endif]-->
</head>
<body>
    <div id="header">
        <div class="header">The Pyramid Web Application Development Framework</div>
    </div>
    <div id="top">
        <div class="top align-center">
            <img src="${request.application_url}/static/logo.png" width="300" height="80"/>
            <p class="app-welcome">
                Welcome to <span class="app-name">${project}</span>, an application generated by<br/>
                the Pyramid web application development framework.
            </p>
    <div id="wrap">
        <div id="header">
            <div class="header">The Pyramid Web Application Development Framework</div>
        </div>
    </div>
    <div id="bottom">
        <div class="bottom">
            <div id="left" class="align-right">
                <h3>Search Pyramid documentation</h3>
                <form method="get" action="http://docs.pylonshq.com/pyramid/dev/search.html">
                      <input type="text" id="q" name="q" value="" />
                      <input type="submit" id="x" value="Search" />
                  </form>
        <div id="top">
            <div class="top align-center">
                <img src="${request.application_url}/static/logo.png" width="300" height="80"/>
                <p class="app-welcome">
                    Welcome to <span class="app-name">${project}</span>, an application generated by<br/>
                    the Pyramid web application development framework.
                </p>
            </div>
            <div id="right" class="align-left">
                <h3>Pyramid links</h3>
                <ul class="links">
                    <li>
                        <a href="http://pylonshq.com">Pylons Website</a>
                    </li>
                    <li>
                        <a href="http://docs.pylonshq.com/pyramid/dev/#narrative-documentation">Narrative Documentation</a>
                    </li>
                    <li>
                        <a href="http://docs.pylonshq.com/pyramid/dev/#api-documentation">API Documentation</a>
                    </li>
                    <li>
                        <a href="http://docs.pylonshq.com/pyramid/dev/#tutorials">Tutorials</a>
                    </li>
                    <li>
                        <a href="http://docs.pylonshq.com/pyramid/dev/#change-history">Change History</a>
                    </li>
                    <li>
                        <a href="http://docs.pylonshq.com/pyramid/dev/#sample-applications">Sample Applications</a>
                    </li>
                    <li>
                        <a href="http://docs.pylonshq.com/pyramid/dev/#support-and-development">Support and Development</a>
                    </li>
                    <li>
                        <a href="irc://irc.freenode.net#pyramid">IRC Channel</a>
                    </li>
                  </ul>
        </div>
        <div id="bottom">
            <div class="bottom">
                <div id="left" class="align-right">
                    <h3>Search Pyramid documentation</h3>
                    <form method="get" action="http://docs.pylonshq.com/pyramid/dev/search.html">
                          <input type="text" id="q" name="q" value="" />
                          <input type="submit" id="x" value="Search" />
                      </form>
                </div>
                <div id="right" class="align-left">
                    <h3>Pyramid links</h3>
                    <ul class="links">
                        <li>
                            <a href="http://pylonshq.com">Pylons Website</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/">The Pylons Project Documentation</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/pyramid/dev/#narrative-documentation">Narrative Documentation</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/pyramid/dev/#api-documentation">API Documentation</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/pyramid/dev/#tutorials">Tutorials</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/pyramid/dev/#change-history">Change History</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/pyramid/dev/#sample-applications">Sample Applications</a>
                        </li>
                        <li>
                            <a href="http://docs.pylonshq.com/pyramid/dev/#support-and-development">Support and Development</a>
                        </li>
                        <li>
                            <a href="irc://irc.freenode.net#pyramid">IRC Channel</a>
                        </li>
                      </ul>
                </div>
            </div>
        </div>
    </div>
docs/narr/MyProject/setup.py
@@ -6,7 +6,7 @@
README = open(os.path.join(here, 'README.txt')).read()
CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
requires = ['pyramid']
requires = ['pyramid', 'WebError']
setup(name='MyProject',
      version='0.0',
@@ -21,7 +21,7 @@
      author='',
      author_email='',
      url='',
      keywords='web wsgi bfg pyramid pylons',
      keywords='web pyramid pylons',
      packages=find_packages(),
      include_package_data=True,
      zip_safe=False,
@@ -30,7 +30,8 @@
      test_suite="myproject",
      entry_points = """\
      [paste.app_factory]
      app = myproject:app
      """
      main = myproject:main
      """,
      paster_plugins=['pyramid'],
      )
docs/narr/project.rst
@@ -180,7 +180,7 @@
   $ ../bin/python setup.py develop
   ...
   Finished processing dependencies for MyProject==0.1
   Finished processing dependencies for MyProject==0.0
This will install the :term:`distribution` representing your
application's into the interpreter's library set so it can be found
@@ -245,17 +245,17 @@
a Python prompt.  To do so, use the ``paster`` shell command with the
``pshell`` argument:
The first argument to ``pshell`` is the path to your application's
``.ini`` file.  The second is the section name inside the ``.ini``
file which points to your *application* as opposed to any other
section within the ``.ini`` file.  For example, if your application
``.ini`` file might have a ``[app:main]`` section that looks like so:
The first argument to ``pshell`` is the path to your application's ``.ini``
file.  The second is the ``app`` section name inside the ``.ini`` file which
points to *your application* as opposed to any other section within the
``.ini`` file.  For example, if your application ``.ini`` file might have a
``[app:MyProject]`` section that looks like so:
.. code-block:: ini
   :linenos:
   [app:main]
   use = egg:MyProject#app
   [app:MyProject]
   use = egg:MyProject
   reload_templates = true
   debug_authorization = false
   debug_notfound = false
@@ -263,20 +263,16 @@
   default_locale_name = en
If so, you can use the following command to invoke a debug shell using
the name ``main`` as a section name:
the name ``MyProject`` as a section name:
.. code-block::  text
   [chrism@vitaminf shellenv]$ ../bin/paster --plugin=pyramid \
                               pshell development.ini main
   [chrism@vitaminf shellenv]$ ../bin/paster pshell development.ini MyProject
   Python 2.4.5 (#1, Aug 29 2008, 12:27:37) 
   [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
   Type "help" for more information. "root" is the Pyramid app root object.
   >>> root
   <foo.models.MyModel object at 0x445270>
.. note:: You *might* get away without passing
          ``--plugin=pyramid`` to the ``pshell`` command.
   <myproject.models.MyModel object at 0x445270>
If you have `IPython <http://en.wikipedia.org/wiki/IPython>`_
installed in the interpreter you use to invoke the ``paster`` command,
@@ -288,46 +284,40 @@
.. code-block::  text
   [chrism@vitaminf shellenv]$ ../bin/paster --plugin=pyramid pshell \
         --disable-ipython development.ini main
   [chrism@vitaminf shellenv]$ ../bin/paster pshell --disable-ipython \
                                development.ini MyProject
You should always use a section name argument that refers to the
actual ``app`` section within the Paste configuration file that points
at your :app:`Pyramid` application *without any middleware wrapping*.
In particular, a section name is inappropriate as the second argument
to ``pshell`` if the configuration section it names is a ``pipeline``
rather than an ``app``.  For example, if you have the following
``.ini`` file content:
.. warning::
.. code-block:: ini
   :linenos:
   You should always use a section name argument that refers to the actual
   ``app`` section within the Paste configuration file that points at your
   :app:`Pyramid` application *without any middleware wrapping*.  In
   particular, a section name is inappropriate as the second argument to
   ``pshell`` if the configuration section it names is a ``pipeline`` rather
   than an ``app``.  For example, if you have the following ``.ini`` file
   content:
   [app:myapp]
   use = egg:MyProject#app
   reload_templates = true
   debug_authorization = false
   debug_notfound = false
   debug_templates = true
   default_locale_name = en
   .. code-block:: ini
      :linenos:
   [pipeline:main]
   pipeline = egg:repoze.tm2#tm
              myapp
      [app:MyProject]
      use = egg:MyProject
      reload_templates = true
      debug_authorization = false
      debug_notfound = false
      debug_templates = true
      default_locale_name = en
The command you use to invoke the interactive shell should be:
      [pipeline:main]
      pipeline = egg:WebError#evalerror
                 myapp
.. code-block::  text
   If you use ``main`` as the section name argument instead of ``myapp``
   against the above ``.ini`` file, an error will occur.  Use the most
   specific reference to your application within the ``.ini`` file possible
   as the section name argument.
   [chrism@vitaminf shellenv]$ ../bin/paster --plugin=pyramid pshell \
         development.ini myapp
If you use ``main`` as the section name argument instead of ``myapp``
against the above ``.ini`` file, an error will likely occur.  Use the
most specific reference to the application within the ``.ini`` file
possible as the section name argument.
Press ``Ctrl-D`` to exit the interactive shell (or ``Ctrl-Z`` on
Windows).
Press ``Ctrl-D`` to exit the interactive shell (or ``Ctrl-Z`` on Windows).
.. index::
   single: running an application
@@ -498,87 +488,82 @@
.. literalinclude:: MyProject/development.ini
   :linenos:
This file contains several "sections" including ``[DEFAULT]``,
``[app:main]``, and ``[server:main]``.
This file contains several "sections" including ``[app:MyProject]``,
``[pipeline:main]``, and ``[server:main]``.
The ``[DEFAULT]`` section consists of global parameters that are
shared by all the applications, servers and :term:`middleware` defined
within the configuration file.  By default it contains one key
``debug``, which is set to ``true``.  This key is used by various
components to decide whether to act in a "debugging" mode.
``pyramid`` itself does not do anything at all with this parameter,
and neither does any template-generated application.
The ``[app:MyProject]`` section represents configuration for your
application.  This section name represents the ``MyProject`` application (and
it's an ``app`` -lication, thus ``app:MyProject``)
The ``[app:main]`` section represents configuration for your
application.  This section name represents the ``main`` application
(and it's an ``app`` -lication, thus ``app:main``), signifying that
this is the default application run by ``paster serve`` when it is
invoked against this configuration file.  The name ``main`` is a
convention signifying that it the default application.
The ``use`` setting is required in the ``[app:main]`` section.  The
``use`` setting points at a :term:`setuptools` :term:`entry point`
named ``MyProject#app`` (the ``egg:`` prefix in ``egg:MyProject#app``
indicates that this is an entry point *URI* specifier, where the
"scheme" is "egg").
The ``use`` setting is required in the ``[app:MyProject]`` section.  The
``use`` setting points at a :term:`setuptools` :term:`entry point` named
``MyProject`` (the ``egg:`` prefix in ``egg:MyProject`` indicates that this
is an entry point *URI* specifier, where the "scheme" is "egg").
``egg:MyProject`` is actually shorthand for a longer spelling:
``egg:MyProject#main``.  The ``#main`` part is omitted for brevity, as it is
the default.
.. sidebar::  ``setuptools`` Entry Points and PasteDeploy ``.ini`` Files
   This part of configuration can be confusing so let's try to clear
   things up a bit.  Take a look at the generated ``setup.py`` file
   for this project.  Note that the ``entry_point`` line in
   ``setup.py`` points at a string which looks a lot like an ``.ini``
   file.  This string representation of an ``.ini`` file has a section
   named ``[paste.app_factory]``.  Within this section, there is a key
   named ``app`` (the entry point name) which has a value
   ``myproject:app``.  The *key* ``app`` is what our
   ``egg:MyProject#app`` value of the ``use`` section in our config
   file is pointing at.  The value represents a :term:`dotted Python
   name` path, which refers to a callable in our ``myproject``
   package's ``__init__.py`` module.  In English, this entry point can thus
   be referred to as a "Paste application factory in the ``MyProject``
   project which has the entry point named ``app`` where the entry
   point refers to a ``app`` function in the ``mypackage``
   module".  If indeed if you open up the ``__init__.py`` module generated
   within the ``myproject`` package, you'll see a ``app`` function.
   This is the function called by :term:`PasteDeploy` when the
   ``paster serve`` command is invoked against our application.  It
   accepts a global configuration object and *returns* an instance of
   our application.
   This part of configuration can be confusing so let's try to clear things
   up a bit.  Take a look at the generated ``setup.py`` file for this
   project.  Note that the ``entry_point`` line in ``setup.py`` points at a
   string which looks a lot like an ``.ini`` file.  This string
   representation of an ``.ini`` file has a section named
   ``[paste.app_factory]``.  Within this section, there is a key named
   ``main`` (the entry point name) which has a value ``myproject:main``.  The
   *key* ``main`` is what our ``egg:MyProject#main`` value of the ``use``
   section in our config file is pointing at (although it is actually
   shortened to ``egg:MyProject`` there).  The value represents a
   :term:`dotted Python name` path, which refers to a callable in our
   ``myproject`` package's ``__init__.py`` module.  In English, this entry
   point can thus be referred to as a "Paste application factory in the
   ``MyProject`` project which has the entry point named ``main`` where the
   entry point refers to a ``main`` function in the ``mypackage`` module".
   If indeed if you open up the ``__init__.py`` module generated within the
   ``myproject`` package, you'll see a ``main`` function.  This is the
   function called by :term:`PasteDeploy` when the ``paster serve`` command
   is invoked against our application.  It accepts a global configuration
   object and *returns* an instance of our application.
The ``use`` setting is the only setting required in the ``[app:main]``
The ``use`` setting is the only setting *required* in the ``[app:MyProject]``
section unless you've changed the callable referred to by the
``MyProject#app`` entry point to accept more arguments: other settings
you add to this section are passed as keywords arguments to the
callable represented by this entry point (``app`` in our ``__init__.py``
module).  You can provide startup-time configuration parameters to
your application by requiring more settings in this section.
``egg:MyProject`` entry point to accept more arguments: other settings you
add to this section are passed as keywords arguments to the callable
represented by this entry point (``main`` in our ``__init__.py`` module).
You can provide startup-time configuration parameters to your application by
requiring more settings in this section.
The ``reload_templates`` setting in the ``[app:main]`` section is a
:app:`Pyramid` -specific setting which is passed into the
framework.  If it exists, and its value is ``true``, :term:`Chameleon`
template changes will not require an application restart to be
detected.  See :ref:`reload_templates_section` for more information.
The ``reload_templates`` setting in the ``[app:MyProject]`` section is a
:app:`Pyramid` -specific setting which is passed into the framework.  If it
exists, and its value is ``true``, :term:`Chameleon` and :term:`Mako`
template changes will not require an application restart to be detected.  See
:ref:`reload_templates_section` for more information.
.. warning:: The ``reload_templates`` option should be turned off for
   production applications, as template rendering is slowed when it is
   turned on.
The ``debug_templates`` setting in the ``[app:main]`` section is a
:app:`Pyramid` -specific setting which is passed into the
framework.  If it exists, and its value is ``true``, :term:`Chameleon`
template exceptions will contained more detailed and helpful
information about the error than when this value is ``false``.  See
:ref:`debug_templates_section` for more information.
The ``debug_templates`` setting in the ``[app:MyProject]`` section is a
:app:`Pyramid` -specific setting which is passed into the framework.  If it
exists, and its value is ``true``, :term:`Chameleon` template exceptions will
contained more detailed and helpful information about the error than when
this value is ``false``.  See :ref:`debug_templates_section` for more
information.
.. warning:: The ``debug_templates`` option should be turned off for
   production applications, as template rendering is slowed when it is
   turned on.
Various other settings may exist in this section having to do with
debugging or influencing runtime behavior of a :app:`Pyramid`
application.  See :ref:`environment_chapter` for more information
about these settings.
Various other settings may exist in this section having to do with debugging
or influencing runtime behavior of a :app:`Pyramid` application.  See
:ref:`environment_chapter` for more information about these settings.
``[pipeline:main]``, has the name ``main`` signifying that this is the
default 'application' (although it's actually a pipeline of middleware and an
application) run by ``paster serve`` when it is invoked against this
configuration file.  The name ``main`` is a convention used by PasteDeploy
signifying that it the default application.
The ``[server:main]`` section of the configuration file configures a
WSGI server which listens on TCP port 6543.  It is configured to
@@ -596,6 +581,14 @@
other types of things you can put into this ``.ini`` file, such as
other applications, :term:`middleware` and alternate :term:`WSGI`
server implementations.
.. note::
   You can add a ``[DEFAULT]`` section to your ``development.ini`` file.
   Such a section should consists of global parameters that are shared by all
   the applications, servers and :term:`middleware` defined within the
   configuration file.
.. index::
   single: setup.py
@@ -629,29 +622,26 @@
documentation to explain everything about setuptools setup files, we'll
provide a whirlwind tour of what exists in this file in this section.
Your application's name can be any string; it is specified in the
``name`` field.  The version number is specified in the ``version``
value.  A short description is provided in the ``description`` field.
The ``long_description`` is conventionally the content of the README
and CHANGES file appended together.  The ``classifiers`` field is a
list of `Trove
Your application's name can be any string; it is specified in the ``name``
field.  The version number is specified in the ``version`` value.  A short
description is provided in the ``description`` field.  The
``long_description`` is conventionally the content of the README and CHANGES
file appended together.  The ``classifiers`` field is a list of `Trove
<http://pypi.python.org/pypi?%3Aaction=list_classifiers>`_ classifiers
describing your application.  ``author`` and ``author_email`` are text
fields which probably don't need any description.  ``url`` is a field
that should point at your application project's URL (if any).
``packages=find_packages()`` causes all packages within the project to
be found when packaging the application.  ``include_package_data``
will include non-Python files when the application is packaged if
those files are checked into version control.  ``zip_safe`` indicates
that this package is not safe to use as a zipped egg; instead it will
always unpack as a directory, which is more convenient.
``install_requires`` and ``tests_require`` indicate that this package
depends on the ``pyramid`` package.  ``test_suite`` points at the
package for our application, which means all tests found in the
package will be run when ``setup.py test`` is invoked.  We examined
``entry_points`` in our discussion of the ``development.ini`` file; this
file defines the ``app`` entry point that represents our project's
application.
describing your application.  ``author`` and ``author_email`` are text fields
which probably don't need any description.  ``url`` is a field that should
point at your application project's URL (if any).
``packages=find_packages()`` causes all packages within the project to be
found when packaging the application.  ``include_package_data`` will include
non-Python files when the application is packaged if those files are checked
into version control.  ``zip_safe`` indicates that this package is not safe
to use as a zipped egg; instead it will always unpack as a directory, which
is more convenient.  ``install_requires`` and ``tests_require`` indicate that
this package depends on the ``pyramid`` package.  ``test_suite`` points at
the package for our application, which means all tests found in the package
will be run when ``setup.py test`` is invoked.  We examined ``entry_points``
in our discussion of the ``development.ini`` file; this file defines the
``main`` entry point that represents our project's application.
Usually you only need to think about the contents of the ``setup.py``
file when distributing your application to other people, or when
@@ -673,9 +663,12 @@
   ``templates/mytemplate.pt`` file and the files in the ``static`` directory
   are not packaged in the tarball.  To allow this to happen, check all the
   files that you'd like to be distributed along with your application's
   Python files into a version control system such as Subversion.  After you
   do this, when you rerun ``setup.py sdist``, all files checked into the
   version control system will be included in the tarball.
   Python files into Subversion.  After you do this, when you rerun
   ``setup.py sdist``, all files checked into the version control system will
   be included in the tarball.  If you don't use Subversion, and instead use
   a different version control system, you may need to install a setuptools
   add-on such as ``setuptools-git`` or ``setuptools-hg`` for this behavior
   to work properly.
``setup.cfg``
~~~~~~~~~~~~~
@@ -703,7 +696,7 @@
#. An ``__init__.py`` file which signifies that this is a Python
   :term:`package`.  It also contains code that helps users run the
   application, include an ``app`` function which is used as a Paste entry
   application, include a ``main`` function which is used as a Paste entry
   point.
#. A ``models.py`` module, which contains :term:`model` code.
@@ -741,14 +734,14 @@
#. Line 2 imports the ``get_root`` function from
   :mod:`myproject.models` that we use later.
#. Lines 4-17 define a function that returns a :app:`Pyramid`
#. Lines 4-14 define a function that returns a :app:`Pyramid`
   WSGI application.  This function is meant to be called
   by the :term:`PasteDeploy` framework as a result of running
   ``paster serve``.
   Within this function, configuration is performed.
   Lines 12-14 register a "default view" (a view that has no ``name``
   Lines 9-11 register a "default view" (a view that has no ``name``
   attribute).  It is registered so that it will be found when the
   :term:`context` of the request is an instance of the
   :class:`myproject.models.MyModel` class.  The first argument to
@@ -762,11 +755,11 @@
   ``templates`` directory of the ``myproject`` package.  The template file
   it actually points to is a :term:`Chameleon` ZPT template file.
   Line 15 registers a static view, which will serve up the files from the
   Line 12 registers a static view, which will serve up the files from the
   ``mypackage:static`` :term:`resource specification` (the ``static``
   directory of the ``mypackage`` package).
   Line 17 returns a :term:`WSGI` application to the caller of the function
   Line 14 returns a :term:`WSGI` application to the caller of the function
   (Paste).
``views.py``
pyramid/paster_templates/starter/+package+/__init__.py_tmpl
@@ -3,9 +3,6 @@
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    It is usually called by the PasteDeploy framework during
    ``paster serve``.
    """
    config = Configurator(root_factory=get_root, settings=settings)
    config.begin()