summaryrefslogtreecommitdiff
path: root/docs/tutorials/gae/index.rst
blob: 18a2f0da4d6d49babda9d91f4e64826b37b34b2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
.. _appengine_tutorial:

Running :mod:`repoze.bfg` on Google's App Engine
================================================

As of :mod:`repoze.bfg` version 0.8, it is possible to run a
:mod:`repoze.bfg` application on Google's `App Engine
<http://code.google.com/appengine/>`_.  Content from this tutorial was
contributed by "YoungKing", based on the `"appengine-monkey" tutorial
for Pylons <http://code.google.com/p/appengine-monkey/wiki/Pylons>`_.
This tutorial is written in terms of using the command line on a UNIX
system; it should be possible to perform similar actions on a Windows
system.

.. note:: :term:`chameleon.zpt` cannot be used on Google App Engine
   due to GAE environment limitations, so the tutorial is presented in
   terms of using :term:`Jinja2` as the templating language in the
   generated BFG application.

#. Download Google's `App Engine SDK
   <http://code.google.com/appengine/downloads.html>`_ and install it
   on your system.

#. Use Subversion to check out the source code for
   ``appengine-monkey``.

   .. code-block:: bash

      $ svn co http://appengine-monkey.googlecode.com/svn/trunk/ appengine-monkey

#. Use ``appengine_homedir`` to create a :term:`virtualenv` for your
   application.

   .. code-block:: bash
   
      $ export GAE_PATH=/usr/local/google_appengine
      $ python2.5 appengine-homedir.py --gae $GAE_PATH bfgapp

   Note that ``$GAE_PATH`` should be the path where you have unpacked
   the App Engine SDK.  (On Mac OS X at least,
   ``/usr/local/google_appengine`` is indeed where the installer puts
   it).

   This will set up an environment in ``bfgapp/``, with some tools
   installed in ``bfgapp/bin``. There will also be a directory
   ``bfgapp/app/`` which is the directory you will upload to
   appengine.

#. Install :mod:`repoze.bfg.jinja2` into the virtualenv

   .. code-block:: bash

      $ cd bfgapp/
      $ bin/easy_install -i http://dist.repoze.org/bfg/dev/simple/ repoze.bfg.jinja2

   This will install :mod:`repoze.bfg` in the environment.

#. Create your application

   We'll use the standard way to create a :mod:`repoze.bfg`
   application, but we'll have to move some files around when we are
   done:

   .. code-block:: bash

      $ rm -rf bfgapp
      $ bin/paster create -t bfg_jinja2_starter bfgapp
      $ mv bfgapp aside
      $ mv aside/bfgapp .
      $ rm -rf aside

#. Edit ``config.py``

   .. code-block:: python

    APP_NAME = 'bfgapp.run:app'
    APP_ARGS = ({},)

#.  Edit ``runner.py``

    To prevent errors for ``import site``, add this code stanza before
    ``import site`` in app/runner.py:

    .. code-block:: python

       import sys
       sys.path = [path for path in sys.path if "site-packages" not in path]
       import site

    You will also need to comment the ``assert`` in the file.

#. Run the application.  ``dev_appserver.py`` is typically installed
   by the SDK in the global path but you need to be sure to run it
   with Python 2.5 (or whatever version of Python your GAE SDK
   expects).

   .. code-block:: python

      $ cd ../..
      $ python2.5 /usr/local/bin/dev_appserver.py bfgapp/app/

   Startup success looks something like this::

      [chrism@vitaminf bfg_gae]$ python2.5 /usr/local/bin/dev_appserver.py bfgapp/app/INFO     2009-05-03 22:23:13,887 appengine_rpc.py:157] Server: appengine.google.com
      INFO     2009-05-03 22:23:13,898 appcfg.py:320] Checking for updates to the SDK.
      INFO     2009-05-03 22:23:14,034 appcfg.py:334] The SDK is up to date.
      WARNING  2009-05-03 22:23:14,035 datastore_file_stub.py:368] Could not read datastore data from /var/folders/dB/dByJ-qkiE6igZD4Yrm+nMk+++TI/-Tmp-/dev_appserver.datastore
      WARNING  2009-05-03 22:23:14,035 datastore_file_stub.py:368] Could not read datastore data from /var/folders/dB/dByJ-qkiE6igZD4Yrm+nMk+++TI/-Tmp-/dev_appserver.datastore.history
      WARNING  2009-05-03 22:23:14,045 dev_appserver.py:3240] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
      INFO     2009-05-03 22:23:14,050 dev_appserver_main.py:463] Running application bfgapp on port 8080: http://localhost:8080

#. Hack on your bfg application, using a normal run, debug, restart
   process.

#. `Sign up for a GAE account <http://code.google.com/appengine/>`_
   and create an application.  You'll need a mobile phone to accept an
   SMS in order to receive authorization.

#. Edit the application's ID in ``app.yaml`` to match the application
   name you created during GAE account setup.

   .. code-block:: python

      application: mycoolbfgapp

#. Upload the application

   .. code-block:: python

      $ python2.5 /usr/local/bin/appcfg.py update bfgapp/app

   You will almost certainly find that you hit the 1000-file GAE file
   limit.

   .. code-block:: python

       HTTPError: HTTP Error 400: Bad Request
       Rolling back the update.
       Error 400: --- begin server output ---
       Max number of files and blobs is 1000.
       --- end server output ---

   You will be able to get around this by zipping libraries. You can
   use ``pip`` to create zipfiles from packages.  For example:

   .. code-block:: python

     $ bin/pip zip -l

   This shows your zipped packages (by default, none) and your
   unzipped packages. You can zip a package like so:

   .. code-block:: python 

     $ bin/pip zip pytz-2009g-py2.5.egg

   Note that it requires the whole egg file name.  A the time of this
   tutorial's writing, the 1000 file limit can be subverted by causing
   the following packages to be zipped:

   - pytz
   - chameleon.core
   - chameleon.zpt
   - zope.i18n
   - zope.testing

   After zipping, a successful upload looks like so::

    [chrism@vitaminf bfgapp]$ python2.5 /usr/local/bin/appcfg.py update ../bfgapp/app/
    Scanning files on local disk.
    Scanned 500 files.
    Scanned 1000 files.
    Initiating update.
    Cloning 761 application files.
    Cloned 100 files.
    Cloned 200 files.
    Cloned 300 files.
    Cloned 400 files.
    Cloned 500 files.
    Cloned 600 files.
    Cloned 700 files.
    Uploading 12 files.
    Deploying new version.
    Checking if new version is ready to serve.
    Will check again in 1 seconds.
    Checking if new version is ready to serve.
    Will check again in 2 seconds.
    Checking if new version is ready to serve.
    Will check again in 4 seconds.
    Checking if new version is ready to serve.
    Will check again in 8 seconds.
    Checking if new version is ready to serve.
    Will check again in 16 seconds.
    Checking if new version is ready to serve.
    Closing update: new version is ready to start serving.
    Uploading index definitions.

#. Visit "<yourapp>.appspot.com" in a browser.