问题描述
我在我的项目中同时使用 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 保存图像
- 首先让我们准备数据并在 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'
]
})
- 之后,我们将尝试从 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