即使添加了服务帐户,Pyrebase 也不会从存储中下载文件

问题描述

我在我的项目中同时使用 react 和 python 并且都连接到 firebase

(与 firebase 的主要连接是通过反应)

为了将 python 连接到 firebase,我使用的是 Pyrebase 我需要使用 Pyrebase 从存储中下载文件。 所有其他服务都可以正常工作。 我还注意到,如果我将 URL 显示为对 django 的响应并打开它,我将无法打开存储在实时数据库中的文件的 storageURL (我存储了存储 url,使用 pyrebase 将其显示为响应,从响应中我获取了 url 并在浏览器中查看,然后显示以下错误

{
  "error": {
    "code": 400,"message": "Invalid HTTP method/URL pair."
  }
}

我已将 serviceAccountKey 添加到配置中,我已启用存储规则以读取和写入所有人,并在 firebase 中允许两者都使用 cors。还没下载东西

我该怎么办?

代码

from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
import requests
import pyrebase

config = {
#config files here
}

firebase = pyrebase.initialize_app(config)
storage = firebase.storage()
db = firebase.database()


@api_view(['POST'])             
def dosharing(request):
  secrets = []
  for secret in db.child('secret').get().val().values():
    secrets.append(secret.get("url"))

  for url in secrets:
    requests.get(url) #initially i used pyrebase download this is just a try

  return(Response(secrets))

解决方法

你的问题是你在访问 URL 后得到响应,之后没有保存它。因为 requests 将响应数据保存在内存中(在变量中),直到您将其保存在某处

这里有很多方法[ 1,2 ] 如何在 Django 中保存文件

我将向您展示如何使用原始 python 保存图像

  1. 首先让我们准备数据并在 firebase 实时数据库中添加图片网址
import pyrebase

config = {
    ...
}

firebase = pyrebase.initialize_app(config)
db = firebase.database()

client = db.child('root')
client.set({
    'urls': [
        'https://images.unsplash.com/photo-1617854818583-09e7f077a156?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80','https://images.unsplash.com/photo-1598128558393-70ff21433be0?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=422&q=80'
    ]
})
  1. 之后,我们将尝试从 firebase 实时数据库中获取 URL,并将响应与图像保存到将在项目目录中创建的 save_folder 目录中
import pyrebase
import requests
import time
from os import path,mkdir

config = {
    ...
}

firebase = pyrebase.initialize_app(config)
db = firebase.database()

urls = db.child('root').get().val().get('urls')

# create folder where files will be saved if not exists
if not path.isdir('save_folder'):
    mkdir('save_folder')

for url in urls:

    # set random filename (timestamp in my case)
    filename = str(time.time()) + '.jpg'

    # get response (it is still in RAM)
    r = requests.get(url,timeout=5)

    # save response data to disk
    if r.status_code == 200:
        with open('save_folder/' + filename,'wb') as f:
            f.write(r.content)

因此,如您所见,您需要将内容write 写入磁盘,而不仅仅是将内容get

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...