python - 如何使用 Python (FLASK) 实现 Google Drive V3 API
问题描述
为了下载文件,我一直试图在 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))