我正在嘗試通過 Flask 應用程式從 Firebase 存盤下載檔案。
目標URL作業在瀏覽器,當我硬編碼。
但是,當我從前端傳遞目標 URL 作為引數時,它顯示urllib.error.HTTPError: HTTP Error 403: Forbidden.
前端代碼 (JavaScript)
async function testTriggerLocalFunction(downloadURL) {
const response = await fetch(
// downloadURL is a string like "https://firebasestorage.googleapis.com...."
"http://127.0.0.1:5001?audioURL=" downloadURL
);
// console.log(response);
}
后端代碼(燒瓶)
@app.route('/')
def handle_request():
result = analyze(request.args.get("audioURL"))
def analyze(audioURL):
# Download sound file
# url = audioURL
input_name = "input.wav"
input_path = get_file_path(input_name)
# 403 error when audioURL passed from url parameter passed!
urllib.request.urlretrieve(audioURL, input_path)
# But it will work if I do something like "audioURL = "https://firebasestorage.googleapis.com...."
可能的錯誤點
- 也許你缺乏適當的授權?
- 也許你缺少一個合適的標題?
- 這兩個似乎不太可能,因為代碼在 URL 被硬編碼時有效。
- 網址編碼?
- 這個 PHP 問題有一些 URL 編碼問題,但我不確定這是否適用于我。
還有什么可能導致這個問題?
127.0.0.1 - - [09/Dec/2021 14:08:59] "GET /?audioURL=https://firebasestorage.googleapis.com/MY_TARGET_AUDIO_URL" 500 -
Traceback (most recent call last):
File "/Users/leochoo/.virtualenvs/py-vocal-journal/lib/python3.9/site-packages/flask/app.py", line 2091, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/leochoo/.virtualenvs/py-vocal-journal/lib/python3.9/site-packages/flask/app.py", line 2076, in wsgi_app
response = self.handle_exception(e)
File "/Users/leochoo/.virtualenvs/py-vocal-journal/lib/python3.9/site-packages/flask/app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "/Users/leochoo/.virtualenvs/py-vocal-journal/lib/python3.9/site-packages/flask/app.py", line 1518, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/leochoo/.virtualenvs/py-vocal-journal/lib/python3.9/site-packages/flask/app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/leochoo/.virtualenvs/py-vocal-journal/lib/python3.9/site-packages/flask/app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/Users/leochoo/dev/vocal-journal/backend/playground/py-vocal-journal/app.py", line 68, in handle_request
result = analyze(request.args.get("audioURL"))
File "/Users/leochoo/dev/vocal-journal/backend/playground/py-vocal-journal/app.py", line 98, in analyze
urllib.request.urlretrieve(audioURL, input_path)
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 239, in urlretrieve
with contextlib.closing(urlopen(url, data)) as fp:
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 214, in urlopen
return opener.open(url, data, timeout)
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 523, in open
response = meth(req, response)
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 632, in http_response
response = self.parent.error(
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 561, in error
return self._call_chain(*args)
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 494, in _call_chain
result = func(*args)
File "/Users/leochoo/.pyenv/versions/3.9.1/lib/python3.9/urllib/request.py", line 641, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
我查看了類似的問題,但我無法確定我的情況的解決方案。
Can't access FireBase Database via HTTP/REST error 403 Forbidden 403 error when passing url as a parameter requests.get returns 403 while the same url works in browser urllib.request.urlretrieve ERROR trying to download jpeg in Python
uj5u.com熱心網友回復:
有幾種方法可以做到這一點,因為 ?audioURL={url} 引數作為兩個引數,因為它包含一個 & 符號:
結合在 python 服務器代碼上接收的兩個查詢引數,而不是您打算通過的單個查詢引數
在客戶端使用 base64 編碼 audioURL 資料變數,然后在服務器端解碼以保留弄亂查詢引數格式的特殊字符
很高興有幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377543.html
標籤:python flask python-requests urllib
下一篇:遍歷字典時洗掉字典中的鍵?
