使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录

  • (一)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')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:Ubuntu修改root密码

Linux:Ubuntu修改root密码 修改默认grub配置文件 rootshanxin:~# vim /etc/default/grub# 主要修改内容如下:GRUB_DEFAULT0 #GRUB_TIMEOUT_STYLEhidden 注释这一行 GRUB_TIMEOUT5 # 将这一行的时间改为5秒进行开启启动的grub文件的复写 rootshanxin:~…

芯课堂 | UI Creator 物理键盘移植指南

LVGL提供输入设备的种类一共有5种,分别是:touchpad(触摸板)、mouse(鼠标)、keypad(键盘)、encoder(编码器)、button(外部按键)。而基于…

Tron 节点 性能压测

文章目录 一、代码说明1.1 主要功能1.2 代码示例1.3 代码解释1.4 执行流程 二、结果分析三、参数解释3.1 numWorkers 和 numRequests 说明3.2 使用场景 四、注意事项 最近搭建了一个TRON节点,同事不相信我的自建节点比官方更靠谱,咱们给他使用golang写一…

如何成为一个专业的AI产品经理?

可以找专业的老师带。 可以找专业的内容学。 可以多遇挫折并快速学习,屡败屡战,笔者本人从业AI十年有余,吃了不少苦,有过很多或成功或失败的经历。 成为一个专业的AI产品经理需要一系列专业知识和技能的积累,以及在…

axios - 简 单 的 请 求 模 板

import {message } from ant-design-vue import axios from axios import {useUserStore } from @/store/modules/user import router from @/routerconst instance = axios.create({baseURL: http://192.168.110.171:5201,timeout: 5000, })* 请求拦截器 insta

切换Ubuntu开机的主题

要将Ubuntu系统的启动画面(即开机时的显示界面)从Lubuntu切换回原生的Ubuntu界面,可以按照以下步骤操作: 1. 安装原生Ubuntu的plymouth主题 首先,确保你已经安装了原生Ubuntu的plymouth主题。打开终端并运行以下命令…

基于Matlab卷积神经网络(CNN)人脸识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别技术作为计算机视觉领域的一个重要分支,已经广泛应用于安全监控、身份验证…

Python基础知识归纳总结

目录 一、线性表 总结 二、栈 三、队列 四、哈希表 五、字符串 六、正则表达式 综合示例 一、线性表 线性表(通常用列表表示)是一种按线性顺序存储元素的数据结构。 插入元素 (append, insert) 删除元素 (remove, pop) 查找元素 (index) 更新…

FreeRTOS学习——FreeRTOS队列(下)之队列创建

本篇文章记录我学习FreeRTOS队列创建的知识。主要分享队列创建需要使用的初始化函数、队列复位函数。 需要进一步了解FreeRTOS队列的相关知识,读者可以参考以下文章: FreeRTOS学习——FreeRTOS队列(上)_freertos 单元素队列-CSDN博…

Spring、SpringMVC、SpringBoot 三者之间是什么关系

Spring、SpringMVC、SpringBoot 是三个独立的框架,它们之间的关系是: 1. Spring是一个Java的轻量级应用框架,提供了基于IoC和AOP的支持,用于构建企业级应用。Spring有多 个模块,包括 Spring Core、Spring Context、Spring JDBC、…

高质量油封选择的重要性

在现代工业和机械系统中,油封的作用至关重要。它们不仅防止润滑剂泄漏,还阻止污染物进入系统,从而保障设备的正常运行。选择高质量的油封对于保证设备性能、延长使用寿命和降低维护成本至关重要。本文将从多个角度探讨选择高质量油封的重要性…

【hackmyvm】Slowman靶机

文章目录 主机探测端口探测FTP匿名登录 目录探测hydra爆破mysql爆破zip------fcrackzip爆破密码-----john提权 主机探测 ┌──(root㉿kali)-[/home/kali] └─# fping -ag 192.168.9.1/24 2>/dev/null 192.168.9.221 主机192.168.9.224 靶机端口探测 ┌──(roo…

送变电乙级资质申请攻略:关键步骤与注意事项

关键步骤: 工商注册与资本核实: 确保企业已正式注册,且注册资金不少于100万元人民币,同时准备企业法人营业执照等相关证明文件。 人员配置与注册: 根据资质要求,配置齐全合理的专业技术人员,包括…

【教程】Linux 安装 kkFileView 文档在线预览项目 及优化

【教程】Linux 安装 kkFileView 文档在线预览项目 官网 kkFileView - 在线文件预览 (keking.cn) 安装包 可以直接下载成品 也可以下载source 源码 自己编译 kkFileView 发行版 - Gitee.com 打开IDEA 然后先clear 再install 然后在 file-online-preview\server\target 目录…

Nginx R31 doc-09-Serving Static Content 静态内容

提供静态内容 配置 NGINX 和 NGINX Plus 以提供静态内容,使用类型特定的根目录,检查文件存在性,并进行性能优化。 本节介绍如何配置 NGINX 和 NGINX Plus 以提供静态内容,如何定义搜索请求文件的路径,如何设置索引文…

WordPress插件Disable WP REST API,可根据是否登录来禁用REST API

前面跟大家分享了代码版禁用WordPress REST API的方法(详见『WordPress4.7以上版本如何禁用JSON REST API?』),不过有些站长不太敢折腾自己的网站代码,那么建议试试这款Disable WP REST API,它可以&#xf…

小结5:朗读练习第二段

五、朗读练习2 2024-5-6始,5-14终,5-15写。 我渐渐体会到一些朗读的乐趣。但我还要考研,要写作业、期末考试。如果是在大一该多好。我可以就这样一天一天的写下去,慢慢地有一些自己的作品,还能录视频发到b站上。 上一篇…

通过修改物理内存实现跨进程内存读写

习一下利用修改物理内存来跨进程内存读写 系统:win10 21h1 x64 编译环境: vs2022 详情见附录 基础 虚拟地址转物理地址 虚拟地址也称线性地址,一个线性地址进程的DirBase地址可以转换成物理地址。先来看线性地址的含义 在x64体系中只实现了48位的virtu…

刀片式服务器的主要组件有哪些?

刀片式服务器是专门为特殊应用行业跟高密度计算环境设计的,是高可用高密度低成本的服务器平台,刀片服务器这个名称主要是根据产品的形状,刀片式服务器的组成单元外形扁平,就像刀片一样,整体设计的比较紧凑,…

C#和C++有什么区别?

C#和C都是广泛使用的编程语言,但它们在设计理念、应用场景和语法上有许多显著的区别。以下是一些关键区别的详细介绍: 1. 设计理念和目的 C: 设计目的:C是一种面向系统编程和应用程序开发的语言,具有高效性和灵活性…