Make local appengine use remote datastore (Python)

343 views
Skip to first unread message

Danny Tran

unread,
Mar 10, 2016, 11:32:32 AM3/10/16
to Google App Engine
I'm attempting to make my appengine application running locally use a remote datastore.

In appengine_config.py I'm adding the following lines.

from google.appengine.ext.remote_api import remote_api_stub
remote_api_stub.ConfigureRemoteApiForOAuth('MyApp.appspot.com','/_ah/remote_api') # name removed

Per the instructions here:

However, when I try to send a basic HTTP request to my local app, it results in an infinite recursion loop between a url fetcher and a logger.

Am I missing something?

George-Cristian Bîrzan

unread,
Mar 10, 2016, 12:02:58 PM3/10/16
to google-a...@googlegroups.com
We had a very similar issue: refresh token -> memcache -> refresh token. It was because we initialised the testbed beforehand.

--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-appengi...@googlegroups.com.
To post to this group, send email to google-a...@googlegroups.com.
Visit this group at https://groups.google.com/group/google-appengine.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-appengine/dc594b12-1da8-4513-9e11-0dc66e59917a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
George-Cristian Bîrzan

Nick (Cloud Platform Support)

unread,
Mar 10, 2016, 7:05:13 PM3/10/16
to Google App Engine
Hey Danny,

I can't say that I'm 100% sure what's happening to cause this behaviour. Could you share some more logs, config files, and code? If possible, I'd like to try to observe this on my own system. If it represents an issue in the SDK or platform, rather than a user misconfiguration, this would be necessary to get it fixed, and in the event that it's a user error, I'd like to help discover the proper means of getting access to remote Datastore via remote API from the development machine. 

Best wishes,

Nick
Cloud Platform Community Support

Danny Tran

unread,
Mar 11, 2016, 12:00:59 AM3/11/16
to Google App Engine
Hi Nick,

Sure.

I've been able to reproduce the issue using a very dumbed-down view.

app.yaml
...
- url: /.*
  script
: myapp.wsgi.application
  secure
: always
...


wsgi.py
import os
os
.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")


from django.core.wsgi import get_wsgi_application
application
= get_wsgi_application()

settings.py
import os
BASE_DIR
= os.path.dirname(os.path.dirname(__file__))
VERSION
= '0.1.2'
SECRET_KEY
= 'REMOVED'
URLFETCH_TIMEOUT
= 60
URLFETCH_VALIDATE_CERTS
= True
GAE_NAMESPACE
= 'dev'
GAE_SERVICE_ACCOUNT
= {
   
'valid_app_ids': ['REMOVED'],
}
ROOT_URLCONF
= 'myapp.urls'
DEBUG
= True

appengine_config.py
from google.appengine.api import urlfetch
from google.appengine.ext import vendor
vendor
.add('lib') # oauth2client lib is installed here

from google.appengine.ext.remote_api import remote_api_stub
remote_api_stub
.ConfigureRemoteApiForOAuth('myapp.appspot.com','/_ah/remote_api')

from django.conf import settings

urls.py
from django.conf.urls import patterns, include, url
from django.shortcuts import render
from django.http import HttpResponse

def foo(request):
   
return HttpResponse("foo", content_type='text/plain')


urlpatterns
= patterns('',
    url
(r'^v1/foo$', foo)
)


Let me know if you are able to reproduce.

Danny Tran

unread,
Mar 11, 2016, 12:10:22 AM3/11/16
to Google App Engine
Some additional discoveries.

If I set_trace() in my "view" method and step through the code. The recursion seems to launch when executing this line:

Danny Tran

unread,
Mar 11, 2016, 12:16:02 AM3/11/16
to Google App Engine
Also, here's a few rounds of the recursion stack trace:

File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall
   self._MakeRealSyncCall(service, call, request, response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 227, in _MakeRealSyncCall
   encoded_response = self._server.Send(self._path, encoded_request)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 247, in Send
   url, method=method, body=payload, headers=headers)
 File "...myapp.../lib/oauth2client/client.py", line 622, in new_request
   redirections, connection_type)
 File "...myapp.../lib/httplib2/__init__.py", line 1609, in request
   (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
 File "...myapp.../lib/httplib2/__init__.py", line 1351, in _request
   (response, content) = self._conn_request(conn, request_uri, method, body, headers)
 File "...myapp.../lib/httplib2/__init__.py", line 1307, in _conn_request
   response = conn.getresponse()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 522, in getresponse
   **extra_kwargs)
 File "...myapp.../lib/httplib2/__init__.py", line 1106, in fixed_fetch
   validate_certificate=validate_certificate)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 271, in fetch
   return rpc.get_result()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 378, in _get_fetch_result
   rpc.check_success()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success
   self.__rpc.CheckSuccess()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_rpc.py", line 157, in _WaitImpl
   self.request, self.response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall
   self._MakeRealSyncCall(service, call, request, response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 227, in _MakeRealSyncCall
   encoded_response = self._server.Send(self._path, encoded_request)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 247, in Send
   url, method=method, body=payload, headers=headers)
 File "...myapp.../lib/oauth2client/client.py", line 622, in new_request
   redirections, connection_type)
 File "...myapp.../lib/httplib2/__init__.py", line 1609, in request
   (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
 File "...myapp.../lib/httplib2/__init__.py", line 1351, in _request
   (response, content) = self._conn_request(conn, request_uri, method, body, headers)
 File "...myapp.../lib/httplib2/__init__.py", line 1307, in _conn_request
   response = conn.getresponse()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 522, in getresponse
   **extra_kwargs)
 File "...myapp.../lib/httplib2/__init__.py", line 1106, in fixed_fetch
   validate_certificate=validate_certificate)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 271, in fetch
   return rpc.get_result()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 378, in _get_fetch_result
   rpc.check_success()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success
   self.__rpc.CheckSuccess()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_rpc.py", line 157, in _WaitImpl
   self.request, self.response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall
   self._MakeRealSyncCall(service, call, request, response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 227, in _MakeRealSyncCall
   encoded_response = self._server.Send(self._path, encoded_request)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 247, in Send
   url, method=method, body=payload, headers=headers)
 File "...myapp.../lib/oauth2client/client.py", line 622, in new_request
   redirections, connection_type)
 File "...myapp.../lib/httplib2/__init__.py", line 1609, in request
   (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
 File "...myapp.../lib/httplib2/__init__.py", line 1351, in _request
   (response, content) = self._conn_request(conn, request_uri, method, body, headers)
 File "...myapp.../lib/httplib2/__init__.py", line 1307, in _conn_request
   response = conn.getresponse()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 522, in getresponse
   **extra_kwargs)
 File "...myapp.../lib/httplib2/__init__.py", line 1106, in fixed_fetch
   validate_certificate=validate_certificate)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 271, in fetch
   return rpc.get_result()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 378, in _get_fetch_result
   rpc.check_success()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success
   self.__rpc.CheckSuccess()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_rpc.py", line 157, in _WaitImpl
   self.request, self.response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall
   self._MakeRealSyncCall(service, call, request, response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 227, in _MakeRealSyncCall
   encoded_response = self._server.Send(self._path, encoded_request)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 247, in Send
   url, method=method, body=payload, headers=headers)
 File "...myapp.../lib/oauth2client/client.py", line 622, in new_request
   redirections, connection_type)
 File "...myapp.../lib/httplib2/__init__.py", line 1609, in request
   (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
 File "...myapp.../lib/httplib2/__init__.py", line 1351, in _request
   (response, content) = self._conn_request(conn, request_uri, method, body, headers)
 File "...myapp.../lib/httplib2/__init__.py", line 1307, in _conn_request
   response = conn.getresponse()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 522, in getresponse
   **extra_kwargs)
 File "...myapp.../lib/httplib2/__init__.py", line 1106, in fixed_fetch
   validate_certificate=validate_certificate)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 271, in fetch
   return rpc.get_result()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 378, in _get_fetch_result
   rpc.check_success()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success
   self.__rpc.CheckSuccess()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_rpc.py", line 157, in _WaitImpl
   self.request, self.response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall
   self._MakeRealSyncCall(service, call, request, response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 227, in _MakeRealSyncCall
   encoded_response = self._server.Send(self._path, encoded_request)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 247, in Send
   url, method=method, body=payload, headers=headers)
 File "...myapp.../lib/oauth2client/client.py", line 622, in new_request
   redirections, connection_type)
 File "...myapp.../lib/httplib2/__init__.py", line 1609, in request
   (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
 File "...myapp.../lib/httplib2/__init__.py", line 1351, in _request
   (response, content) = self._conn_request(conn, request_uri, method, body, headers)
 File "...myapp.../lib/httplib2/__init__.py", line 1307, in _conn_request
   response = conn.getresponse()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 522, in getresponse
   **extra_kwargs)
 File "...myapp.../lib/httplib2/__init__.py", line 1106, in fixed_fetch
   validate_certificate=validate_certificate)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 271, in fetch
   return rpc.get_result()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 378, in _get_fetch_result
   rpc.check_success()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success
   self.__rpc.CheckSuccess()
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_rpc.py", line 157, in _WaitImpl
   self.request, self.response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall
   self._MakeRealSyncCall(service, call, request, response)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 227, in _MakeRealSyncCall
   encoded_response = self._server.Send(self._path, encoded_request)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 247, in Send
   url, method=method, body=payload, headers=headers)
 File "...myapp.../lib/oauth2client/client.py", line 622, in new_request
   redirections, connection_type)
 File "...myapp.../lib/httplib2/__init__.py", line 1487, in request
   self.disable_ssl_certificate_validation)
 File "...myapp.../lib/httplib2/__init__.py", line 1129, in __init__
   timeout=timeout)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 562, in __init__
   HTTPConnection.__init__(self, host, port, strict, timeout, source_address)
 File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 356, in __init__
   def __init__(self, host, port=None, strict=None,
 File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 51, in trace_dispatch
   return self.dispatch_call(frame, arg)
 File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 77, in dispatch_call
   if not (self.stop_here(frame) or self.break_anywhere(frame)):
 File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 152, in break_anywhere
   return self.canonic(frame.f_code.co_filename) in self.breaks
RuntimeError: maximum recursion depth exceeded

Danny Tran

unread,
Mar 15, 2016, 4:16:34 PM3/15/16
to Google App Engine
Ok, I think I figured out the issue.

ConfigureRemoteApiForOAuth replaces the stub for ALL services. 

This includes the "urlfetch" service.

The problem is the httplib2 library uses "urlfetch" when it detects google appengine.

So using urlfetch in your app, results in a call to rpc.check_success() which results in another call to "urlfetch" and so on ad infinitum.

One workaround I have is to replace the 'urlfetch' stub with it's original value after configuring the the remote api for oauth.

from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.api import apiproxy_stub_map


local_stub
= apiproxy_stub_map.apiproxy.GetStub('urlfetch')

remote_api_stub
.ConfigureRemoteApiForOAuth('myapp.appspot.com','/_ah/remote_api')

apiproxy_stub_map
.apiproxy.ReplaceStub('urlfetch', local_stub)


This prevented the infinite recursion.

I'm curious if there is a way to disable urlfetch from using google appengine built in that I am missing.  Either way, the documentation on making an app use the remote api does not mention anything about the urlfetch service recursion issue.

Hope this helps someone.

Nick (Cloud Platform Support)

unread,
Mar 15, 2016, 5:39:23 PM3/15/16
to Google App Engine
Hey Danny,

Thanks for your detailed analysis. I was proceeding with attempting to get the code into a reproducing example, and your latest post and deep reporting of the information has been a model of how to report an issue. While this thread is technically off-topic here and should be in the Public Issue Tracker, I'll handle cross-posting the information you've provided there from this point on. 

Thanks again for your excellent reporting and analysis!

Sincerely,


Nick
Cloud Platform Community Support

Danny Tran

unread,
Mar 15, 2016, 8:29:38 PM3/15/16
to Google App Engine
Sure thing, and sorry about being off-topic. 

Please let me know the public issue tracking link/number when you get around to it. 

Thanks :)

Nick (Cloud Platform Support)

unread,
Mar 16, 2016, 3:23:56 PM3/16/16
to Google App Engine
Here's the link to the thread, it should see replies shortly. Cheers!

Nick (Cloud Platform Support)

unread,
Jan 25, 2017, 3:37:14 PM1/25/17
to Google App Engine
This is just an update for anybody who finds this thread and isn't quite sure how to integrate the fix above. I've written an example python app that can be run in the devserver environment to connect to the remote datastore. Be aware that this will likely require you to have installed google-api-python-client on your system with pip beforehand.


import time
import webapp2
from google.appengine.ext import ndb

class EpochStamp (ndb.Model):
    t = ndb.IntegerProperty()



from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.api import apiproxy_stub_map

local_urlfetch_stub = apiproxy_stub_map.apiproxy.GetStub('urlfetch')

def configure_remote_api_dev_safe (host):
    remote_api_stub.ConfigureRemoteApiForOAuth(
        host,
        '/_ah/remote_api')
    apiproxy_stub_map.apiproxy.ReplaceStub('urlfetch', local_urlfetch_stub)


def configure_remote_api_dev_unsafe (host):
    remote_api_stub.ConfigureRemoteApiForOAuth(
        host,
        '/_ah/remote_api')



class MainHandler(webapp2.RequestHandler):
    def get(self):
        app = self.request.get('app')
        configure_remote_api_dev_safe ('{}.appspot.com'.format(app))
        # configure_remote_api_dev_unsafe ('{}.appspot.com'.format(app))                                                                                       

        e = EpochStamp(t=int(time.time()))
        e.put()
        self.response.write('Inserted.')

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)
Reply all
Reply to author
Forward
0 new messages