Q:

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

I've been stuck trying to implement this Google Drive API script in FLASK in order to download a file but I am getting this error which seems to be impacting the entire script;
local variable 'request' referenced before assignment

If I rename the variable to req instead the error goes away, however I don't think the request is being properly sent as my print statements produce no results. It could have something to do with conflicting requests that are made to retrieve data from my AJAX call but I'm not sure. Any help is appreciated.
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()

Here is my entire code;
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))

A:

After a day of further testing, I cracked it. To anyone in the future looking for a solution to implementing Drive API Download with Flask, feel free to use my code as a boilerplate.
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))

