当用户通过PushManager.subscribe()创建订阅时,给定applicationServerKey(VAPID 公钥),它会创建一个有效的订阅,其内容可以发送并存储在数据库中。发送到数据库的内容如下所示:
{"endpoint":"https://fcm.googleapis.com/fcm/send/dpH5lCsTSSM:APA91bHqjZxM0VImWWqDRN7U0a3AycjUf4O-byuxb_wJsKRaKvV_iKw56s16ekq6FUqoCF7k2nICUpd8fHPxVTgqLunFeVeB9lLCQZyohyAztTH8ZQL9WCxKpA6dvTG_TUIhQUFq_n",
"keys": {
"p256dh":"BLQELIDm-6b9Bl07YrEuXJ4BL_YBVQ0dvt9NQGGJxIQidJWHPNa9YrouvcQ9d7_MqzvGS9Alz60SZNCG3qfpk=",
"auth":"4vQK-SvRAN5eo-8ASlrwA=="
}
}
Run Code Online (Sandbox Code Playgroud)
来源:推送通知简介
该对象提供了唯一的端点,后端服务器知道在哪里调用以将推送通知发送到并使用相应的 VAPID 私钥进行身份验证。
谷歌表示,该端点的唯一标识符是不透明的,无法从中确定任何个人数据。
标识符是不透明的。作为开发人员,您无法从中确定任何个人数据。此外,它还不稳定,因此不能用于跟踪用户。
按照Surya Sankar的本教程,可以将整个订阅对象发送到服务器并存储在数据库中,以便稍后向关联的浏览器/设备发送推送通知时使用。然而,在将条目记录到数据库之前,它会比较是否已经记录了具有相同内容的条目,以免创建重复项。
@app.route("/api/push-subscriptions", methods=["POST"])
def create_push_subscription():
json_data = request.get_json()
subscription = PushSubscription.query.filter_by(
subscription_json=json_data['subscription_json']
).first()
if subscription is None:
subscription = PushSubscription(
subscription_json=json_data['subscription_json']
)
db.session.add(subscription)
db.session.commit()
return jsonify({
"status": "success"
})
Run Code Online (Sandbox Code Playgroud)
由于整个订阅对象用于webpush触发推送通知,因此我知道整个订阅对象需要发送到服务器。
from pywebpush import webpush, WebPushException
import json
from flask import current_app
def trigger_push_notification(push_subscription, title, body):
try:
response = webpush(
# Uses entire subscription object stored …Run Code Online (Sandbox Code Playgroud) 我试图了解将大文件从前端上传到服务器的最佳方法是什么。对于前端,我使用一个名为的库react-dropzone,它允许我获取我打算上传的文件的信息。我的上传组件看起来像这样:
// Node Modules
import React, {useCallback} from 'react';
import {useDropzone} from 'react-dropzone';
import {useTranslation} from 'react-i18next';
export default function Upload() {
// i18n
const [t] = useTranslation();
// React Dropzone
const onDrop = useCallback((droppedFiles) => {
console.log(droppedFiles);
}, []);
const {getRootProps, getInputProps, isDragActive} = useDropzone({onDrop});
return (
<div className="upload" {...getRootProps()}>
<input {...getInputProps()} />
{isDragActive ? (
<p>{t('DROP_FILES_HERE')}</p>
) : (
<p>{t('DRAG_AND_DROP_FILES_HERE_OR_CLICK_TO_SELECT_FILES')}</p>
)}
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
这使我能够访问文件的内容,例如文件的名称、类型和大小(以字节为单位)。
这个库似乎也适用于更大的文件(100+ MB),但我的问题是当我想上传这个数据时如何调用这些数据?
我的一个想法是使用localStorage,但最大大小似乎约为5 到 10 MB。我也在Redux …