文章目錄
- (一)Supabase
- (二)Realtime(消息)
- (2.1)Python 消息訂閱
- (2.2)JavaScript 消息訂閱
- (三)Storage(存儲)
- (3.1)Python 存儲操作
- (3.2)JavaScript 存儲操作
(一)Supabase
在《用 Next.js 和 Supabase 進行“全棧”開發的入門》中,我搭(抄)建(襲)了一個類似論壇雛形的東西。
后端用了Supabase,但例子中僅限于數據庫CRUD(增刪改查)的操作。
如果用Supabase只是Postgres用數據庫,那么就稱不上BaaS了吧😄
因為萬惡的簡稱會重復,網上搜BaaS會出來:羊叫聲,區塊鏈即服務,蔚來汽車租電模式,綁定為服務……所以……
概念:
- 💡BaaS = Backend as a Service,就是一種云服務,旨在為移動和 Web 應用提供后端云服務,包括云端數據/文件存儲、賬戶管理、消息推送等等……
打開Supabase的儀表板,除了已經用到的數據庫和認證以外,還有3個主要內容:
- Realtime
- Storage
- Edge Functions
(二)Realtime(消息)
簡單說Supabase的Realtime
就是實時的消息推送。
當我們把一張表的Realtime
選項開啟后,這張表數據的增刪改操作,都會產生消息,并且推送到每個訂閱了這個頻道消息的客戶端上。
?? 注意:
Realtime
是基于WebSocket
。不能保證每條消息都送到,所以你的應用如果有嚴格的要求,就不能完全依靠Realtime
的推送,比如也使用長輪詢Long Polling
。
圖)表開啟Realtime:
圖)設置RealTime涉及的操作。
調試時我們可以在Supabase儀表板中作為客戶端,訂閱一個Realtime
的頻道。
實際使用時,我們需要用到Supabase社區項目來連接和使用消息訂閱,如下。
(2.1)Python 消息訂閱
見:🔗Supabase社區項目
from realtime.connection import SocketSUPABASE_ID = "你的ID"
API_KEY = "你的匿名Key或系統Key"def callback1(payload):print("Callback 1: ", payload)if __name__ == "__main__":URL = f"wss://{SUPABASE_ID}.supabase.co/realtime/v1/websocket?apikey={API_KEY}&vsn=1.0.0"s = Socket(URL)s.connect()channel_1 = s.set_channel("realtime:*")channel_1.join().on("UPDATE", callback1)s.listen()
(2.2)JavaScript 消息訂閱
見:🔗Supabase社區項目
import { RealtimeClient } from '@supabase/realtime-js'const client = new RealtimeClient(REALTIME_URL, {params: {apikey: API_KEY},
})const channel = client.channel('test-channel', {})channel.subscribe((status, err) => {if (status === 'SUBSCRIBED') {console.log('Connected!')}if (status === 'CHANNEL_ERROR') {console.log(`There was an error subscribing to channel: ${err.message}`)}if (status === 'TIMED_OUT') {console.log('Realtime server did not respond in time.')}if (status === 'CLOSED') {console.log('Realtime channel was unexpectedly closed.')}
})
(三)Storage(存儲)
簡單說Supabase提供的文件存儲是桶buckets
,可以當成一個盤符,一個掛載的設備。
在一個bucket
里面,可以創建目錄和文件。
?? 注意:公開的桶
public bucket
,僅表示它有一個可用于下載文件的公有 URL。
所有其他關于存儲桶或文件的操作,都要求您滿足該存儲桶上的存儲策略(權限)。
另請注意,您應該對所有其他操作使用正常路徑,而不是包含“public”的公共 URL 路徑。
怪不得找不到桶……
(3.1)Python 存儲操作
見:🔗Supabase社區項目
初始化客戶端
import os
from supabase import create_client, Clienturl: str = os.environ.get("SUPABASE_URL")
key: str = os.environ.get("SUPABASE_KEY")
supabase: Client = create_client(url, key)
下載文件
bucket_name: str = "photos"
data = supabase.storage.from_(bucket_name).download("photo1.png")
上傳文件
bucket_name: str = "photos"
new_file = getUserFile()
data = supabase.storage.from_(bucket_name).upload("/user1/profile.png", new_file)
刪除文件
bucket_name: str = "photos"
data = supabase.storage.from_(bucket_name).remove(["old_photo.png", "image5.jpg"])
列舉全部文件
bucket_name: str = "charts"
data = supabase.storage.from_(bucket_name).list()
移動/重命名文件
bucket_name: str = "charts"
old_file_path: str = "generic/graph1.png"
new_file_path: str = "important/revenue.png"
data = supabase.storage.from_(bucket_name).move(old_file_path, new_file_path)
(3.2)JavaScript 存儲操作
見:🔗Supabase項目
下載文件
const { data, error } = await supabase.storage.from('avatars').download('folder/avatar1.png')
上傳文件
const avatarFile = event.target.files[0]
const { data, error } = await supabase.storage.from('avatars').upload('public/avatar1.png', avatarFile, {cacheControl: '3600',upsert: false})
刪除文件
const { data, error } = await supabase.storage.from('avatars').remove(['folder/avatar1.png'])
列舉全部文件
const { data, error } = await supabase.storage.from('avatars').list('folder', {limit: 100,offset: 0,sortBy: { column: 'name', order: 'asc' },})
獲得文件公開URL
const { data } = supabase.storage.from('public-bucket').getPublicUrl('folder/avatar1.png')