4

Using Google App Engine, I am trying to insert a file "a.txt" into my google drive. The error that i get when i view page source of InsertDrive page is

HttpError 401 "Login Required" bound method InsertDrive.error of main.InsertDrive object at 0x10f884b0

Note: I am calling class InsertDrive from my MainHandler Class by showing the url in the Jinja template for the MainHandler class.

import httplib2
import logging
import os
import sys


from os import path
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import run
from apiclient import discovery
from oauth2client import appengine
from oauth2client import client
from google.appengine.api import memcache

from apiclient import errors
from apiclient.http import MediaFileUpload

import webapp2
import jinja2

CREDENTIAL = 'drive.credential'
CLIENT_SECRET_JSON = 'client_secrets.json'
SCOPE = 'https://www.googleapis.com/auth/drive'

FILE_NAME = 'a.txt'




JINJA_ENVIRONMENT = jinja2.Environment(
        loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
        autoescape=True,
        extensions=['jinja2.ext.autoescape'])


CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')


MISSING_CLIENT_SECRETS_MESSAGE = """
Warning: Please configure OAuth 2.0

""" % CLIENT_SECRETS

http = httplib2.Http(memcache)
service = discovery.build('drive', 'v2', http=http)
decorator = appengine.oauth2decorator_from_clientsecrets(
        CLIENT_SECRETS,
        scope=[
            'https://www.googleapis.com/auth/drive',
            'https://www.googleapis.com/auth/drive.appdata',
            'https://www.googleapis.com/auth/drive.apps.readonly',
            'https://www.googleapis.com/auth/drive.file',
            'https://www.googleapis.com/auth/drive.metadata.readonly',
            'https://www.googleapis.com/auth/drive.readonly',
            'https://www.googleapis.com/auth/drive.scripts',
            ],
        message=MISSING_CLIENT_SECRETS_MESSAGE)
title="a.txt"
description="none"
mime_type="text/*"
filename="a.txt"
parent_id=None

class MainHandler(webapp2.RequestHandler):

  @decorator.oauth_aware
  def get(self):
         insert_url = "/InsertDrive"
     if not decorator.has_credentials():
          url = decorator.authorize_url()
          self.redirect(url)
          self.response.write("Hello")
    #variables = {
    #           'url': decorator.authorize_url(),
    #           'has_credentials': decorator.has_credentials(),
    #           'insert_url': "/InsertDrive"
    #           }
         template = JINJA_ENVIRONMENT.get_template('main.html')
         self.response.write(template.render(insert_url=insert_url))

class InsertDrive(webapp2.RequestHandler):
    # ADDED FUNCTION TO UPLOAD  #

      def get(self):
             self.response.out.write('<h1>entered</h1>')
             media_body = MediaFileUpload(filename, mimetype=mime_type, resumable=True)
             self.response.write(media_body)
             body = {
             'title': title,
             'description': description,
                'mimeType': mime_type

                }
             self.response.write(body)
             # Set the parent folder.
             if parent_id:
               body['parents'] = [{'id': parent_id}]

             self.response.write(parent_id)
             try:   
                file = service.files().insert(
                    body=body,
                    media_body=media_body).execute()
                    self.response.write(file)

    # Uncomment the following line to print the File ID
    # print 'File ID: %s' % file['id']

             except errors.HttpError , error:
                self.response.write('<h1>checking if error</h1>: %s' % error)
                self.response.write(self.error)
                print 'An error occured: %s' % error


app = webapp2.WSGIApplication(
        [
            ('/', MainHandler),
            ('/InsertDrive' , InsertDrive),
            (decorator.callback_path, decorator.callback_handler()),
            ],
        debug=True)

Any help would be greatly appreciated Thanks, kira_111

1 Answer 1

2

i tried your code and the problem is fixed if when u try to upload the file instead of using this code

file = service.files().insert(
                body=body,
                media_body=media_body).execute()

you use this

file = service.files().insert(
                body=body,
                media_body=media_body).execute(http=decorator.http())

the difference is that you specify that the credentials that will be used for the upload are the ones that you have authenticated using the decorator.

Hope it helps

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.