Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

How to Install GAE on Ubuntu

DZone's Guide to

How to Install GAE on Ubuntu

· Cloud Zone
Free Resource

Download this eBook outlining the critical components of success for SaaS companies - and the new rules you need to play by.  Brought to you in partnership with NuoDB.

If you want to use Google App Engine on Ubuntu there are a couple of things to note. Firstly GAE has recently moved to version 1.6.5 and secondly Ubuntu has recently released Ubuntu 12.04 (Precise Pangolin). Precise Pangolin is a Long Term Support (LTS) version of Ubuntu to come with Python 2.7 installed, and App Engine has been providing it as an option since February 2012. So if you are starting a new App Engine project, it's probably a good time to move to Python 2.7.

I'll explain briefly how you start a new project and there's a nice clean copy of the code at the bottom that you can cut and paste.

Let's get the show on the road. Choose a name for the project and create and switch to a virtual environment:
PROJ=py27_gae_project
mkvirtualenv ${PROJ}
cdvirtualenv
Note that note that "--no-site-packages" and "--distribute" are now the defaults for mkvirtualenv. You don't even need to use "--python=python2.7" on Ubuntu 12.04.

Now we need to know what the latest version of App Engine is, but as of writing it's 1.6.5:
GAE=1.6.5
wget -O /tmp/gae.zip http://googleappengine.googlecode.com/files/google_appengine_${GAE}.zip
unzip /tmp/gae.zip
Now let's create an App Engine app. The app will need a name that has been created in the App Engine Console:
GAE_APP_NAME=dummy
mkdir -p gae_app/static
Now create the app.yaml file:
echo """application: ${GAE_APP_NAME}
version: development
runtime: python27
api_version: 1
threadsafe: true

default_expiration: 7d

handlers:
- url: /static
  static_dir: static
- url: .*
  script: wsgi_app.app
""" > gae_app/app.yaml


And finally the app itself:

echo """import webapp2

class MainPage(webapp2.RequestHandler):
  def get(self):
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write('Please replace me with a decent WSGI App Framework such as Flask')

app = webapp2.WSGIApplication([('/', MainPage)],
                              debug=True)
""" > gae_app/wsgi_app.py
And finally to run the development server:
python ./google_appengine/dev_appserver.py gae_app/
I hope that this has all been of some help to you. Did I miss anything? Please comment below.

PROJ=py27_gae_project

mkvirtualenv --python=python2.7 ${PROJ}

cdvirtualenv

 

GAE=1.6.5

wget -O /tmp/gae.zip http://googleappengine.googlecode.com/files/google_appengine_${GAE}.zip

unzip /tmp/gae.zip

 

GAE_APP_NAME=dummy

mkdir -p gae_app/static

 

echo """application: ${GAE_APP_NAME}

version: development

runtime: python27

api_version: 1

threadsafe: true

 

default_expiration: 7d

 

handlers:

- url: /static

static_dir: static

- url: .*

script: wsgi_app.app

""" > gae_app/app.yaml

 

 

echo """import webapp2

 

class MainPage(webapp2.RequestHandler):

def get(self):

self.response.headers['Content-Type'] = 'text/plain'

self.response.out.write('Please replace me with a decent WSGI App Framework such as Flask')

 

app = webapp2.WSGIApplication([('/', MainPage)],

debug=True)

""" > gae_app/wsgi_app.py

 

python ./google_appengine/dev_appserver.py gae_app/







 

Learn how moving from a traditional, on-premises delivery model to a cloud-based, software-as-a-service (SaaS) strategy is a high-stakes, bet-the-company game for independent software vendors. Brought to you in partnership with NuoDB.

Topics:

Published at DZone with permission of Col Wilson, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}