APP Engine--Running the example of 'Export to Drive' has errors

50 views
Skip to first unread message

zi yang

unread,
Dec 25, 2018, 10:19:11 PM12/25/18
to Google App Engine
I want to deploy the APP Engine apps with Earth Engine, and I made all contents following the steps of  web(https://developers.google.com/earth-engine/app_engine_intro#deploying-app-engine-apps-with-earth-engine).
The 'oauth2client.client.SignedJwtAssertionCredentials' function in the example "Export to Drive"  has been removed, and I replace it by 'oauth2client.service_account.ServiceAccountCredentials.from_json_keyfile_name'. 
I only want to upload my task to my project, and export it to my drive, so I delete needless code. 

The main code of my server.py as follow:

         EE_CREDENTIALS = ee.ServiceAccountCredentials(
                      config.EE_ACCOUNT, config.EE_PRIVATE_KEY_FILE)

         try:
                      ee.Initialize(EE_CREDENTIALS)
                      print('The Earth Engine package initialized successfully!')
         except ee.EEException as e:
                      print('The Earth Engine package failed to initialize!')
         except:
                      print("Unexpected error:", sys.exc_info()[0])
         raise
         
         JINJA2_ENVIRONMENT = jinja2.Environment(
                      loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
                     autoescape=True,
                     extensions=['jinja2.ext.autoescape'])

          OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive'

          # The app's service account credentials (for Google Drive).
         APP_CREDENTIALS = oauth2client.service_account.ServiceAccountCredentials.from_json_keyfile_name(
                     config.EE_PRIVATE_KEY_FILE,
                     OAUTH_SCOPE)

         APP_DRIVE_HELPER = drive.DriveHelper(APP_CREDENTIALS)

        # The decorator to trigger the user's Drive permissions request flow.
        OAUTH_DECORATOR = oauth2client.contrib.appengine.OAuth2Decorator(
                     client_id=config.OAUTH_CLIENT_ID,
                     client_secret=config.OAUTH_CLIENT_SECRET,
                     scope=OAUTH_SCOPE)

         client_id='104509043647545372991'

         class MainPage(webapp2.RequestHandler):
                    def get(self): 
                          template = JINJA2_ENVIRONMENT.get_template('index_test.html')
                          self.response.out.write(template.render({
                                 'channelToken': channel.create_channel(client_id),
                                 'clientId': client_id,
                          }))
                    self.post()
                    def post(self):
                          def NDVI(image):
                                task = ee.batch.Export.image.toDrive(
                                      image=ndvi_collection.max(),
                                     description='NDVI', 
                                     region=region.getInfo()["coordinates"], 
                                     scale=30, 
                                     crs="EPSG:4326")
                                     task.start()
                          print(task.id)   
          
                          temp_file_prefix = _GetUniqueString()
                          email = ''
                          filename = 'test'
                          user_id = '7185...@qq.com'

                          while task.active():
                                     logging.info('Polling for task (id: %s).', task.id)
                                     time.sleep(TASK_POLL_FREQUENCY)

                          def _SendMessage(message):
                                     logging.info('Sent to client: ' + json.dumps(message))
                                     _SendMessageToClient(client_id, filename, message)

                          # Make a copy (or copies) in the user's Drive if the task succeeded.
                          state = task.status()['state']
                          if state == ee.batch.Task.State.COMPLETED:
                                    logging.info('Task succeeded (id: %s).', task.id)
                                    try:
                                           link = _GiveFilesToUser(temp_file_prefix, email, user_id, filename)
                                           # Notify the user's browser that the export is complete.
                                           _SendMessage({'link': link})
                                    except Exception as e:  # pylint: disable=broad-except
                                           _SendMessage({'error': 'Failed to give file to user: ' + str(e)})
                          else:
                                    _SendMessage({'error': 'Task failed (id: %s).' % task.id})

        app = webapp2.WSGIApplication([
                 ('/', MainPage),
                 (OAUTH_DECORATOR.callback_path, OAUTH_DECORATOR.callback_handler()),
        ], debug=True)

The other code is same as the example "Export to Drive"(https://github.com/google/earthengine-api/tree/master/demos/export-to-drive)

I use the dev_appserver.py to run the app, it returns this error:

         root@localhost:/home/ftp/global_change/site-py# dev_appserver.py --host 0.0.0.0 --enable_host_checking false app.yaml
         INFO     2018-12-25 02:41:14,161 devappserver2.py:278] Skipping SDK update check.
         INFO     2018-12-25 02:41:14,302 api_server.py:275] Starting API server at: http://localhost:42010
         WARNING  2018-12-25 02:41:14,757 inotify_file_watcher.py:203] There are too many directories in your application for changes in all of them to be monitored. You may have to restart the development server to see some changes to your files.
         INFO     2018-12-25 02:41:14,812 dispatcher.py:256] Starting module "default" running at: http://0.0.0.0:8080
         INFO     2018-12-25 02:41:14,813 admin_server.py:150] Starting admin server at: http://localhost:8000
         INFO     2018-12-25 02:41:16,841 instance.py:294] Instance PID: 30984
         INFO     2018-12-25 02:41:17,715 client.py:614] Attempting refresh to obtain initial access_token
         INFO     2018-12-25 02:41:17,750 client.py:903] Refreshing access_token
         The Earth Engine package initialized successfully!
         INFO     2018-12-25 02:41:18,302 discovery.py:270] URL being requested: GET https://www.googleapis.com/discovery/v1/apis/drive/v3/rest?userIp=124.16.186.16
         INFO     2018-12-25 02:41:18,302 client.py:614] Attempting refresh to obtain initial access_token
         INFO     2018-12-25 02:41:18,335 client.py:903] Refreshing access_token
         ISMM6BOPPJUQZME5KXJCVVM2
         INFO     2018-12-25 02:41:19,546 server.py:151] Polling for task (id: ISMM6BOPPJUQZME5KXJCVVM2).
         INFO     2018-12-25 02:41:29,727 server.py:151] Polling for task (id: ISMM6BOPPJUQZME5KXJCVVM2).
         INFO     2018-12-25 02:41:40,105 server.py:161] Task succeeded (id: ISMM6BOPPJUQZME5KXJCVVM2).
         INFO     2018-12-25 02:41:40,116 discovery.py:871] URL being requested: GET https://www.googleapis.com/drive/v3/files?alt=json&q=title+contains+%221545705679SIGRWI%22
         WARNING  2018-12-25 02:41:40,119 urlfetch_stub.py:575] Stripped prohibited headers from URLFetch request: ['content-length']
         INFO     2018-12-25 02:41:40,235 server.py:155] Sent to client: {"error": "Failed to give file to user: <HttpError 400 when requesting https://www.googleapis.com/drive/v3/files?alt=json&q=title+contains+%221545705679SIGRWI%22 returned \"Invalid Value\">"}
         INFO     2018-12-25 02:41:40,258 module.py:861] default: "GET / HTTP/1.1" 200 1020
         INFO     2018-12-25 02:41:40,561 module.py:861] default: "GET /jqueryui/style.css HTTP/1.1" 404 154
         INFO     2018-12-25 02:41:40,806 module.py:861] default: "GET /static/ee_api_js.js HTTP/1.1" 304 -
         INFO     2018-12-25 02:41:40,808 module.py:861] default: "GET /static/jquery.min.js HTTP/1.1" 304 -
         INFO     2018-12-25 02:41:40,810 module.py:861] default: "GET /static/script.js HTTP/1.1" 304 -

I google this error, someone thinks it is the problem of  authentication, and someone considers that the server_account may be wrong. But I have no idea to solve it.
My service account had been whitelisted for Earth Engine access in May.
I hope I can get some help from you! 
Thank you!


         

George (Cloud Platform Support)

unread,
Dec 28, 2018, 6:11:23 PM12/28/18
to Google App Engine
Hello Zi Yang, 

Have you attempted to follow the exact example from the site linked to, without stripping unnecessary code? If that works, you should strip code carefully, and gradually, in step-by-step fashion. 

This discussion group is oriented more towards general opinions, trends, and issues of general nature touching the app engine. For coding and programming architecture, as well as removing unnecessary code, you may be better served in dedicated forums such as stackoverflow, where experienced programmers are within reach and ready to help. 
Reply all
Reply to author
Forward
0 new messages