3 # Copyright 2008 Google Inc.
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 """Demo for the Google App Engine images API.
20 Provides a simple way to apply transforms to canned images.
22 This file contains all request handlers.
27 import wsgiref
.handlers
29 from google
.appengine
.api
import images
30 from google
.appengine
.ext
import webapp
31 from google
.appengine
.ext
.webapp
import template
33 import image_transformer
36 class TemplatedPage(webapp
.RequestHandler
):
37 """Base class for templatized handlers."""
39 def write_template(self
, values
):
40 """Write out the template with the same name as the class name."""
41 path
= os
.path
.join(os
.path
.dirname(__file__
), 'templates',
42 self
.__class
__.__name
__ + '.html')
43 self
.response
.out
.write(template
.render(path
, values
))
46 class MainPage(TemplatedPage
):
47 """Request handler for main index page."""
50 """Handle GET request."""
51 imagelist
= os
.listdir(os
.path
.join(os
.path
.dirname(__file__
), 'samples'))
54 'imagelist': imagelist
,
55 'title': 'App Engine Image Demo'
58 self
.write_template(values
)
61 class ImagePage(TemplatedPage
):
62 """Request handler for image information display page."""
65 """Handle GET request."""
66 image
= self
.request
.get('image')
68 # TODO: More friendly error.
72 # Transformer is used here only to validate parameters.
73 transformer
= image_transformer
.ImageTransformer(self
.request
.params
,
75 transformer
.unknown_params
.remove('image')
76 # format is not really a transform.
77 while 'format' in transformer
.unknown_params
:
78 transformer
.unknown_params
.remove('format')
80 transform_args
= urllib
.urlencode(transformer
.transforms
).replace('%2C',',')
81 if (self
.request
.get('format') == 'png'
82 or self
.request
.get('format') == 'jpeg'):
83 transform_args
+= '&format=%s' % (self
.request
.get('format'))
86 for (method
, _
) in image_transformer
.VALID_TRANSFORMS
.iteritems():
87 documentation
[method
] = getattr(images
.Image
, method
).__doc
__
90 'documentation': documentation
,
92 'title': 'App Engine Image Demo',
93 'transformer': transformer
,
94 'transform_args': transform_args
,
97 self
.write_template(values
)
100 class SamplePage(TemplatedPage
):
101 """Request handler for image transform sample page."""
104 """Handle GET request."""
105 image
= self
.request
.get('image')
107 # TODO: More friendly error.
113 'im_feeling_lucky&resize=200,200',
114 'rotate=90&resize=200,200',
115 'rotate=180&resize=200,200',
116 'rotate=360&resize=200,200',
118 'resize=50,50&resize=200,200',
119 'resize=200,200&crop=0.0,0.0,0.5,0.5',
120 'crop=0.5,0.0,1.0,0.5&resize=200,200',
121 'horizontal_flip&resize=200,200',
122 'vertical_flip&resize=200,200',
127 'title': 'App Engine Image Demo',
128 'transform_list': transform_list
,
130 self
.write_template(values
)
133 class ViewSource(TemplatedPage
):
134 """Page handler for view source page."""
137 """Handle GET request.
139 An extremely simple implementation of view source using a template.
141 files
= ['images_demo.py', 'image_transformer.py']
143 for filename
in files
:
144 f
= open(filename
, 'r')
145 file_contents
+= [{'name': filename
,
146 'contents': f
.read()}]
150 'filecontents': file_contents
,
151 'title': 'App Engine Image Demo Source Code',
153 self
.write_template(values
)
156 class ImageData(webapp
.RequestHandler
):
157 """Request handler for image binary data output."""
159 def load_local_sample_image(self
, filename
):
160 """Load a sample image from a (local to this script) filename."""
161 path
= os
.path
.join(os
.path
.dirname(__file__
), 'samples', filename
)
168 """Handle image data GET."""
169 image
= self
.request
.get('image')
171 # TODO: More friendly error.
176 if self
.request
.get('format') == 'png':
179 data
= self
.load_local_sample_image(image
)
181 transformer
= image_transformer
.ImageTransformer(self
.request
.params
,
183 data
= transformer
.transform_image(data
)
185 if format
== images
.PNG
:
186 self
.response
.headers
['Content-Type'] = 'image/png'
188 self
.response
.headers
['Content-Type'] = 'image/jpeg'
190 self
.response
.out
.write(data
)
194 application
= webapp
.WSGIApplication([('/', MainPage
),
195 ('/tryit', ImagePage
),
196 ('/imagedata', ImageData
),
197 ('/sample', SamplePage
),
198 ('/viewsource', ViewSource
),
201 wsgiref
.handlers
.CGIHandler().run(application
)
203 if __name__
== '__main__':