繁体   English   中英

将App Engine数据存储中的数据导出为Google云端硬盘电子表格

[英]Exporting data from App Engine datastore as a Google Drive spreadsheet

我有一个App Engine应用程序,上面记着我的每月开支以及一些评论或原因。 我想将这些数据导出到Google云端硬盘电子表格中 我使用Django框架。

我在这里浏览了Google提供的教程。 但是他们已经使用webapp2和jinja实现了它。 而且,由于我不使用Django ORM,因此使用Django实施文档似乎太过时了。

以下是我用于上传的代码示例。 如果在下面粘贴的是垃圾,我深表歉意。 请帮忙。

from django.utils.datastructures import SortedDict
import os
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
from oauth2client.appengine import OAuth2DecoratorFromClientSecrets

decorator = OAuth2DecoratorFromClientSecrets(os.path.join(os.path.dirname(__file__ ),    'clientSecrets.json'), 'https://www.googleapis.com/auth/drive')
drive_service = build('drive', 'v2')

class Exporter(object):
    serializedObjects = []
    mime_type = 'text/plain'
    fileToExport = None
    request = None

    def __init__(self, serializedObjects, request):
        self.serializedObjects = serializedObjects
        self.request = request

    def createCSV(self):
        import csv
        import StringIO

        stdout = StringIO.StringIO()
        writer = csv.writer(stdout)
        for obj in self.serializedObjects:
            for value in obj.values():
                writer.writerow([value])
        # I will get the csv produced from my datastore objects here.
        # I would like to upload this into a Google Spreadsheet.
        # The child class ExportToSpreadSheet tries to do this.
        return stdout.getvalue()

class ExportToSpreadSheet(Exporter):

    def __init__(self, *args, **kwargs):
            super(ExportToSpreadSheet, self).__init__(*args, **kwargs)
            self.mime_type = 'application/vnd.google-apps.spreadsheet'

    def create(self):
            import datetime

            valueToDrive = self.createCSV()
            media_body = MediaFileUpload(valueToDrive, mimetype=self.mime_type, resumable=True)
            body = {
        'title' : 'MyExpense_%s' % datetime.datetime.now().strftime('%d_%b_%Y_%H_%M_%S'),
        'description' : '',
        'mimeType' : self.mime_type
            }
            self.fileToExport = drive_service.files().insert(body=body, media_body=media_body, convert=True)
            return self.fileToExport

    @decorator.oauth_aware
    def upload(self):

            if decorator.has_credentials():
                    self.create()
                    self.fileToExport.execute(decorator.http())
                    return self.fileToExport
            raise Exception('user does not have the credentials to upload to google drive.')

@ decorator.oauth_aware仅适用于webapp.RequestHandler子类。 我之所以这样说,是因为在运行代码时遇到此错误。

INFO     2013-09-19 11:28:04,550 discovery.py:190] URL being requested: https://www.googleapis.com/discovery/v1/apis/drive/v2/rest?userIp=%3A%3A1
ERROR    2013-09-19 11:28:05,670 main.py:13] Exception in request:
Traceback (most recent call last):
  File "/home/dev5/divya/jk/MyApp/ItsMyTuition/SDK/google_appengine/lib/django-1.2/django/core/handlers/base.py", line 100, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/home/dev5/divya/jk/MyApp/ItsMyTuition/ItsMyTuition/src/tuition/json/ajaxHandler.py", line 27, in mainHandler
    responseValues = funtionToCall(*args)
  File "/home/dev5/divya/jk/MyApp/ItsMyTuition/ItsMyTuition/src/tuition/json/ajaxHandler.py", line 69, in export
    uploadedFile = exporterInstance.upload()
  File "/home/dev5/divya/jk/MyApp/ItsMyTuition/ItsMyTuition/src/oauth2client/appengine.py", line 770, in setup_oauth
    self._create_flow(request_handler)
  File "/home/dev5/divya/jk/MyApp/ItsMyTuition/ItsMyTuition/src/oauth2client/appengine.py", line 734, in _create_flow
    redirect_uri = request_handler.request.relative_url(
AttributeError: 'ExportToSpreadSheet' object has no attribute 'request'
INFO     2013-09-19 11:28:05,777 module.py:593] default: "POST /ajaxCall/export HTTP/1.1" 200 964

由于我使用的是Django框架,因此我无法获得请求处理程序。

如何在我的方案中进行整合或实现? 我将非常感谢我可能错过的任何代码示例或相关链接。

而且,整个过程都发生在ajax调用中。

提前致谢。

使用mimeType=text/csv并在上传过程中,请求将csv转换为电子表格:

drive_service.files().insert(covert=True, body=body, media_body=media_body, convert=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM