我有一個簡單的燒瓶應用程式。我需要在啟用選項“使用 Cloud IAM 管理授權用戶”的情況下在 Cloud Run 上運行它。
應用程式.py
from flask import Flask
api_app = Flask(__name__)
端點.py
from app import api_app
@api_app.route("/create", methods=["POST"])
def api_create():
# logic
主程式
from app import api_app
from endpoints import *
if __name__ == "__main__":
api_app.run(host="0.0.0.0", port=8080)
如果我在本地運行它,它就可以作業。如果在 docker 中運行,它也能很好地作業。當我將應用程式映像上傳到 Cloud Run 時,沒有部署錯誤。但是當我嘗試呼叫端點時,即使在本地一切正常,我也會收到錯誤訊息。
請求示例:
import urllib
import google.auth.transport.requests
import google.oauth2.id_token
import requests
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "test.json"
audience="https://test-service-*****.a.run.app"
req = urllib.request.Request(audience)
auth_req = google.auth.transport.requests.Request()
token = google.oauth2.id_token.fetch_id_token(auth_req, audience)
response = requests.post(f"{audience}/create", data={
"text": "cool text"
}, headers={
"Authorization": f"Bearer {token}"
})
回復:
<!doctype html>
<html lang=en>
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>
在 Cloud Run 日志中,我只有一個警告日志
POST 400 820b 3ms python-requests/2.26.0 https://test-service-*****.a.run.app/create
檔案:
FROM python:3.8-slim-buster
WORKDIR /alpha
ENV PYTHONUNBUFFERED True
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
CMD exec gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 main:api_app
為什么我無法訪問 Cloud Run 中的應用程式端點?
uj5u.com熱心網友回復:
所以我做了一些測驗,我唯一做的就是從 DockerfileCMD exec gunicorn
和main.py
. 請注意,不需要 dundermain 東西,因為 gunicorn 會處理它。
之后它按預期作業。
請注意,我沒有將其設定為專用端點,因為我懶得為此跳過箍,并且您回傳的回應代碼不是 403。
請注意,我還確保/create
回傳了一些東西。我假設你也這樣做了。
編輯
我已將 CR 端點設為私有,并創建了一個角色為“Cloud Run Invoker”的服務帳戶,創建了一個 JSON 密鑰并將其保存為test.json
我還添加了一些邏輯來列印出令牌,并對第一部分進行解碼。您的輸出應該與我的類似。
編輯 2
最終導致 Flask 無法處理傳入的資料。這里有一個非常好的答案,它解釋了如何從所有不同的發布方式獲取資料
FROM python:3.8-slim-buster
WORKDIR /alpha
ENV PYTHONUNBUFFERED True
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
CMD exec gunicorn --workers 1 --threads 8 --timeout 0 main:api_app
端點.py
from app import api_app
from flask import request
@api_app.route("/create", methods=["POST"])
def api_create():
data = request.data
return f"{data}"
主程式
from app import api_app
from endpoints import *
執行請求.py
import urllib
import requests
import google.auth.transport.requests
import google.oauth2.id_token
import os
import base64
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "test.json"
target_uri = "https://pasta*****.a.run.app"
req = urllib.request.Request(target_uri)
auth_req = google.auth.transport.requests.Request()
token = google.oauth2.id_token.fetch_id_token(auth_req, target_uri)
print(token, "\n")
print(base64.b64decode(f"""{token.split(".")[0]}==""".encode("utf-8")), "\n")
response = requests.post(
f"{target_uri}/create",
data={"text": "cool text"},
headers={"Authorization": f"Bearer {token}"},
)
print(response.text)
輸出
eyJhbGciOiJSUzI1NiIsIm[SNIPPED]
b'{"alg":"RS256","kid":"713fd68c9[SNIPPED]","typ":"JWT"}'
b'text=cool text'
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/536276.html
標籤:Google Cloud Collective Python烧瓶谷歌云平台谷歌云运行
上一篇:將GEThttp請求從localhost:5000發送到localhost:8000時出現問題
下一篇:如何獲取檔案中字串后的實數