Dateien aus Supabase effizient in Python importieren
Supabase speichert Objekte im Object Storage und deren Metadaten in PostgreSQL und eignet sich damit ideal für die Verwaltung großer Dateien, Assets und Nutzer-Uploads. In diesem DevTip zeigen wir, wie Sie Dateien mit Python aus Supabase importieren, mit praktischen Beispielen und bewährten Verfahren für einzelne Dateien ebenso wie für Verzeichnisse.
Einführung in Supabase Storage
Supabase Storage bietet eine einfache und zugleich leistungsstarke Möglichkeit, große Dateien zu speichern und auszuliefern. Da Dateien in Buckets organisiert werden, ganz ähnlich wie bei AWS S3, lassen sich Anwendungs-Assets, Nutzer-Uploads und andere dateibasierte Inhalte leicht verwalten. So sind eine effiziente Speicherung und ein schneller Abruf bei Bedarf sichergestellt.
Überblick über das Python-Ökosystem für Datei-Importe
Python verfügt über ein reichhaltiges Ökosystem für Dateiverarbeitung und API-Interaktionen. Das offizielle Open-Source-Python-SDK für Supabase vereinfacht die Verbindung zu Ihren Supabase-Projekten und die Verwaltung von Storage-Buckets. Dieser Leitfaden nutzt dieses SDK, um Datei-Importe in Ihre Python-Anwendungen zu optimieren.
Schritt-für-Schritt-Anleitung zur Einrichtung der Supabase-Python-Integration
1. Erforderliche Python-Bibliotheken installieren
Stellen Sie vor dem Start sicher, dass Sie Python 3.9 oder höher verwenden. Installieren Sie den offiziellen Supabase-Python-Client mit pip:
pip install supabase==2.13.0
2. Zugangsdaten und Berechtigungen in Supabase konfigurieren
Öffnen Sie die Einstellungen Ihres Supabase-Projekts, um im Bereich „API“ Ihre API-URL und Ihren
API-Schlüssel zu finden. Verwenden Sie den Legacy-anon-JWT-Schlüssel des Projekts und
authentifizieren Sie einen Nutzer, dessen Storage-Richtlinien die folgenden Vorgänge zulassen. Das
fixierte SDK 2.13.0 validiert Projektschlüssel als JWTs und akzeptiert daher das neuere
Schlüsselformat sb_publishable_… nicht. Initialisieren Sie den Client, bevor Sie
eines der Bucket-Beispiele verwenden:
import os
import tempfile
from pathlib import Path
from storage3.exceptions import StorageApiError
from supabase import create_client, Client
supabase: Client = create_client(
os.environ['SUPABASE_URL'], os.environ['SUPABASE_PROJECT_KEY']
)
supabase.auth.sign_in_with_password({
'email': os.environ['SUPABASE_USER_EMAIL'],
'password': os.environ['SUPABASE_USER_PASSWORD'],
})
Erstellen Sie einen privaten Bucket im Dashboard oder verwenden Sie das folgende optionale Bereitstellungsbeispiel ausschließlich mit einer Identität, die Buckets erstellen darf. Gewöhnliche Download-Nutzer benötigen diese Berechtigung nicht:
supabase.storage.create_bucket('my-bucket',
options={
"public": False,
"allowed_mime_types": ["image/png", "image/jpeg"],
"file_size_limit": 1024000, # Limit file size to ~1 MB
}
)
Diese Optionen beschränken die deklarierten MIME-Typen und Upload-Größen; sie prüfen keine Inhalte. Die Zugriffsrichtlinien des Storage bestimmen, welche authentifizierten Nutzer Objekte auflisten und herunterladen können.
3. Verbindung zu Ihrem Supabase-Bucket herstellen
Verwenden Sie für die folgenden Downloads erneut den oben initialisierten, authentifizierten Client
supabase.
Dateien mit Python aus Supabase importieren
Eine einzelne Datei importieren
Die folgende Funktion zeigt, wie Sie eine einzelne Datei aus einem angegebenen Bucket herunterladen. Sie ruft die Datei von Supabase ab und schreibt sie an einen lokalen Zielort:
def download_file(bucket_name: str, file_path: str, destination: str) -> bool:
try:
response = supabase.storage.from_(bucket_name).download(file_path)
target = Path(destination)
target.parent.mkdir(parents=True, exist_ok=True)
# Replace the destination only after a complete download and local write.
with tempfile.TemporaryDirectory(dir=target.parent) as staging:
temporary = Path(staging) / 'download'
temporary.write_bytes(response)
os.replace(temporary, target)
print(f"File downloaded successfully to {destination}")
return True
except StorageApiError as e:
print(f"Storage error: {e}")
except Exception as e:
print(f"Error downloading file: {str(e)}")
return False
# Example usage
download_file('my-bucket', 'folder/image.jpg', 'local/image.jpg')
Dieser synchrone SDK-Aufruf hält die heruntergeladenen Bytes im Arbeitsspeicher. Verwenden Sie ihn für Dateien, die in den verfügbaren Arbeitsspeicher passen; allein durch asynchrone Ausführung wird daraus kein Streaming-Download. Ein fehlgeschlagener Download oder Schreibvorgang lässt ein vorhandenes Ziel unverändert.
Mehrere Dateien aus einem Verzeichnis importieren
Die folgende Funktion durchläuft seitenweise die unmittelbaren Dateien eines entfernten Ordners und überspringt dabei Unterordner. Sie speichert diese Dateien direkt in einem vertrauenswürdigen lokalen Zielverzeichnis. Sie bildet keinen entfernten Verzeichnisbaum nach, und entfernte Schlüssel werden niemals als lokale Verzeichnispfade interpretiert:
def import_directory(bucket_name: str, prefix: str = "", destination: str = "downloads") -> None:
try:
root = Path(destination).resolve()
prefix = prefix.rstrip('/')
offset = 0
page_size = 100
while True:
files = supabase.storage.from_(bucket_name).list(path=prefix, options={
'limit': page_size, 'offset': offset,
'sortBy': {'column': 'name', 'order': 'asc'},
})
for file in files:
if file.get('id') is None:
continue # Folder placeholders have no object ID.
name = file['name']
if not name or name in {'.', '..'} or any(char in name for char in '/\\:\0'):
raise ValueError('Unsafe object name in listing')
file_path = f'{prefix}/{name}' if prefix else name
if not download_file(bucket_name, file_path, str(root / name)):
raise RuntimeError('Import stopped after a failed download')
if len(files) < page_size:
break
offset += page_size
except StorageApiError as e:
print(f"Storage error: {e}")
except Exception as e:
print(f"Error importing directory: {str(e)}")
# Example usage
import_directory('my-bucket', 'images/')
Einschränkungen und Überlegungen zum Storage
- Dateigrößenbeschränkungen und Speicherkontingente hängen vom Tarif und von der Projektkonfiguration ab. Siehe die Supabase-Dokumentation zu Dateilimits.
- Halten Sie Downloads innerhalb des Speicherbudgets dieses Beispiels. Verwenden Sie begrenzte Parallelität und behandeln Sie Drosselungsantworten, wenn Sie einen größeren Importer entwickeln.
- Die Offset-Paginierung setzt voraus, dass der entfernte Ordner während des Auflistens unverändert bleibt. Gleichzeitige Änderungen können dazu führen, dass Einträge übersprungen oder doppelt erfasst werden.
Authentifizierung und Sicherheit
Authentifizieren Sie Ihre Nutzer immer, bevor Sie Storage-Vorgänge ausführen. Melden Sie sich beispielsweise mit der E-Mail-Adresse und dem Passwort eines Nutzers an, damit nachfolgende Vorgänge in einem sicheren Kontext ausgeführt werden:
# Authenticate the user prior to executing storage operations
user = supabase.auth.sign_in_with_password({
"email": os.environ['SUPABASE_USER_EMAIL'],
"password": os.environ['SUPABASE_USER_PASSWORD']
})
# Proceed with storage operations using the authenticated context
response = supabase.storage.from_("private-bucket").download("file.txt")
Denken Sie daran, sensible Zugangsdaten nicht fest im Code zu hinterlegen; verwenden Sie stattdessen sichere Umgebungsvariablen oder Konfigurationsdateien.
Bewährte Verfahren für den Import von Dateien aus Supabase
- Korrekte Authentifizierung verwenden: Stellen Sie sicher, dass der Nutzer authentifiziert ist, bevor Storage-Vorgänge gestartet werden.
- Ausnahmen gezielt behandeln: Verwenden Sie
StorageApiError, um Fehler des Datei-Storage präzise abzufangen und zu behandeln. - Bucket-Richtlinien konfigurieren: Legen Sie strikte Zugriffskontrollen und zulässige MIME-Typen fest, um Ihre Dateien zu schützen.
- Dateitypen und -größen validieren: Verlassen Sie sich auf die Bucket-Konfiguration, um serverseitige Beschränkungen durchzusetzen.
- Ihre Zugangsdaten schützen: Speichern Sie API-Schlüssel und Secrets in Umgebungsvariablen, statt sie im Code einzubetten.
Weitere Ressourcen zur Optimierung von Supabase- und Python-Workflows
- Supabase-Storage-Dokumentation
- Supabase-Python-SDK-Dokumentation
- Leitfaden zur Storage-Zugriffskontrolle
Fazit
Der Import von Dateien aus Supabase in Python ist mit der richtigen Einrichtung und den passenden Sicherheitsmaßnahmen unkompliziert. Das offizielle Supabase-Python-SDK bietet eine robuste Schnittstelle sowohl für einzelne Datei-Downloads als auch für Massenimporte und wahrt dabei sichere Zugriffsprotokolle.
Für fortgeschrittene Dateiverarbeitung oder weitergehende Automatisierung lohnt sich ein Blick auf das Python SDK von Transloadit mit leistungsstarken Lösungen für den Umgang mit Dateien.
