繁体   English   中英

如何使用 Python (FLASK) 实现 Google Drive V3 API

[英]How to Implement Google Drive V3 API with Python (FLASK)

我一直在尝试在 FLASK 中实现此 Google Drive API 脚本以下载文件,但我收到此错误,这似乎影响了整个脚本;

local variable 'request' referenced before assignment

如果我将变量重命名为 req,错误就会消失,但是我认为请求没有被正确发送,因为我的打印语句没有产生任何结果。 它可能与从我的 AJAX 调用中检索数据的冲突请求有关,但我不确定。 任何帮助表示赞赏。

service = build('drive', 'v3', credentials=creds);

    request = service.files().get_media(fileId=file_id)
    fh = io.FileIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print ("Download %d%%." % int(status.progress() * 100), file=sys.stderr)
    return fh.getvalue()

这是我的全部代码;

from __future__ import print_function
from flask import Flask, render_template, jsonify, request
import sys, requests, mimetypes
import pickle
import io
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaIoBaseDownload


@app.route('/drive_download')
def drive_download():

try:
    file_id = request.args.get("fileID") #this is being used to retrieve values from AJAX

    creds = None
    # credentials stuff goes here 
    # credentials stuff goes here 
    # credentials stuff goes here 
    # credentials stuff goes here 
    # credentials stuff goes here 

    service = build('drive', 'v3', credentials=creds);

    request = service.files().get_media(fileId=file_id)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print ("Download %d%%." % int(status.progress() * 100), file=sys.stderr)

    return jsonify(result="it works kk  ") #for testing purposes

except Exception as e:
    return(str(e))

经过一天的进一步测试,我破解了它。 对于未来正在寻找使用 Flask 实现 Drive API 下载的解决方案的任何人,请随意使用我的代码作为样板。

from __future__ import print_function
from flask import Flask, render_template, jsonify, request
import sys, requests, mimetypes
import pickle
import io
import os.path
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload, MediaFileUpload
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

@app.route('/drive_download')
def drive_download():


    #CREDENTIALS
    try:

        SCOPES = ['https://www.googleapis.com/auth/drive']
        ##this might need to be swapped out to work with google picker authentication
        creds = None
        if os.path.exists('token.pickle'):
            with open('token.pickle', 'rb') as token:
                creds = pickle.load(token)
        # If there are no (valid) credentials available, let the user log in.
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file('client_secret.json', SCOPES) #Client_secret.json is what I called my credentials.json
                creds = flow.run_local_server()
        # Save the credentials for the next run
            with open('token.pickle', 'wb') as token:
                pickle.dump(creds, token)




        #DOWNLOAD FILE (I'm downloading a json file)

        #Get file_id from AJAX call (this uses Picker to return the id of a file)  
        file_id = request.args.get("fileID")

        drive_service = build('drive', 'v3', credentials=creds)

        requests = drive_service.files().get_media(fileId = file_id)
        fh = io.BytesIO()
        downloader = MediaIoBaseDownload(fh, requests)
        done = False
        while done is False:
            status, done = downloader.next_chunk()
            print("Download %d%%." % int(status.progress() * 100), file=sys.stderr)
            fh.seek(0)
            json = fh.read()
            jsonRead = json.decode('utf-8') #decode from bytes into string

        return jsonify(jsonRead) #Return file contents back to AJAX call

    except Exception as e:
        return(str(e))

暂无
暂无

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

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