diff --git a/appengine/requests/README.md b/appengine/requests/README.md new file mode 100644 index 000000000000..6e135e2137d4 --- /dev/null +++ b/appengine/requests/README.md @@ -0,0 +1,10 @@ +## App Engine Requests Docs Snippets + +These snippets demonstrate various aspects of App Engine Python request handling. + + +These samples are used on the following documentation page: + +> https://cloud.google.com/appengine/docs/python/requests + + diff --git a/appengine/requests/app.yaml b/appengine/requests/app.yaml new file mode 100644 index 000000000000..bdd5bf04dc25 --- /dev/null +++ b/appengine/requests/app.yaml @@ -0,0 +1,7 @@ +runtime: python27 +api_version: 1 +threadsafe: yes + +handlers: +- url: .* # This regex directs all routes to main.app + script: main.app diff --git a/appengine/requests/main.py b/appengine/requests/main.py new file mode 100644 index 000000000000..5064b5b937e7 --- /dev/null +++ b/appengine/requests/main.py @@ -0,0 +1,66 @@ +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Sample application that demonstrates various aspects of App Engine's request +handling. +""" + +import os +import time + +import webapp2 + + +# [START request_timer] +class TimerHandler(webapp2.RequestHandler): + def get(self): + from google.appengine.runtime import DeadlineExceededError + + try: + time.sleep(70) + self.response.write('Completed.') + except DeadlineExceededError: + self.response.clear() + self.response.set_status(500) + self.response.out.write( + 'The request did not complete in time.') +# [END request_timer] + + +# [START environment] +class PrintEnvironmentHandler(webapp2.RequestHandler): + def get(self): + self.response.headers['Content-Type'] = 'text/plain' + for key, value in os.environ.iteritems(): + self.response.out.write( + "{} = {}\n".format(key, value)) +# [END environment] + + +# [START request_ids] +class RequestIdHandler(webapp2.RequestHandler): + def get(self): + self.response.headers['Content-Type'] = 'text/plain' + request_id = os.environ.get('REQUEST_LOG_ID') + self.response.write( + 'REQUEST_LOG_ID={}'.format(request_id)) +# [END request_ids] + + +app = webapp2.WSGIApplication([ + ('/timer', TimerHandler), + ('/environment', PrintEnvironmentHandler), + ('/requestid', RequestIdHandler) +], debug=True) diff --git a/appengine/requests/main_test.py b/appengine/requests/main_test.py new file mode 100644 index 000000000000..ffed54a69e27 --- /dev/null +++ b/appengine/requests/main_test.py @@ -0,0 +1,44 @@ +# Copyright 2016 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from google.appengine.runtime import DeadlineExceededError +import main +import mock +import webtest + + +def test_timer(testbed): + app = webtest.TestApp(main.app) + + with mock.patch('main.time.sleep') as sleep_mock: + sleep_mock.side_effect = DeadlineExceededError() + app.get('/timer', status=500) + assert sleep_mock.called + + +def test_environment(testbed): + app = webtest.TestApp(main.app) + response = app.get('/environment') + assert response.headers['Content-Type'] == 'text/plain' + assert response.body + + +def test_request_id(testbed): + app = webtest.TestApp(main.app) + os.environ['REQUEST_LOG_ID'] = '1234' + response = app.get('/requestid') + assert response.headers['Content-Type'] == 'text/plain' + assert '1234' in response.body