¿Cómo subir un archivo a Canvas desde el API utilizando Python?

Síntomas

La documentación del APi Canvas funciona perfectamente, pero desde un terminal. ¿Qué sucede si deseas subir varios archivos? El proceso va a ser muy demorado y tardarías  varios días en subir todos los archivos. 

Diagnosis

El siguiente código le va a funcionar para subir archivos de cualquier formato, puede ser en sus archivos personales, un curso, en una tarea, o en los archivos de un estudiante(s), cabe recalcar que debe tener roll de administrador. 

Solution

Espero les sea de mucha utilidad.

import requests
import json

url = "https://<canvas>/api/v1/users/self/files?name=nombre_archivo.png&size=tamaño_de_archivo_en_bytes&parent_folder_path=nombre_de_carpeta"

payload={}
headers = {
'Authorization': '<token>',
}
# Le decimos a Canvas que vamos a subir un archivo
response = requests.request("POST", url, headers=headers, data=payload)

# Si se ejecutó el llamado emitirá un código 200
print(response.status_code)
print("")

data_json = json.loads(response.text)
 
# token para subir el archivo
upload_url = data_json['upload_url']
 
# Parámetros obtenidos
upload_params = data_json['upload_params']

# Parte importante, aquí debes actualizar los parámetros obtenidos y agregar "None" a cada parámetro,
para el elemento en upload_params:
      upload_params [elemento] = ( Ninguno , upload_params [elemento])

# Agregamos el parámetro "archivo"
upload_params [ 'file' ] = '/path/nombre_archivo.png' , open ( '/path/nombre_archivo.png' , 'rb' )

# Una vez actualizados los parámetros y agregado el "file", imprime y vas a obtener algo así
# {'filename': (None, 'prueba.png'), 'content_type': (None, 'image / png'), 'file': ('/path/nombre_archivo.png', <_io.BufferedReader name = '/path/nombre_archivo.png'>)}
imprimir (upload_params)

# Finalmente, hacemos el llamado con el nuevo token generado y con los parámetros actualizados
resp = request.post (upload_url, files = upload_params)
 
# Si se ejecutó el llamado emitirá un código 200
imprimir (resp.status_code)

# Listo !!!, puedes ir a Canvas y el archivo estará subido