django云存储nosuchkey

问题描述 投票:0回答:1

update

我找到了这个, https://django-storages.readthedocs.io/en/latest/backends/gcloud.html 由于我的django是5.1,所以我修改了设置。

STORAGES = { "default": { "BACKEND": "storages.backends.gcloud.GoogleCloudStorage", "OPTIONS": { "bucket_name": "erp-backend", "location": "media", "project_id": "smart-portfolio-412002", }, }, "staticfiles": { "BACKEND": "storages.backends.gcloud.GoogleCloudStorage", "OPTIONS": { "bucket_name": "erp-backend", "location": "static", }, }, } STATIC_URL = "https://storage.googleapis.com/erp-backend/static/" MEDIA_URL = "https://storage.googleapis.com/erp-backend/media/"
现在,我可以在存储桶中找到DRF API上传的文件。但是当去django管理员时,有属性

Exception Value: you need a private key to sign credentials.the credentials you are currently using <class 'google.auth.compute_engine.credentials.Credentials'> just contains a token. see https://googleapis.dev/python/google-api-core/latest/auth.html#setting-up-a-service-account for more details.

I使用GKE部署Django/React项目,云SQL作为DB,用于静态文件的云存储。
当我尝试上传文件(无论是Django Admin和API)时,我得到的URL总是告诉我

This XML file does not appear to have any style information associated with it. The document tree is shown below. <Error> <Code>NoSuchKey</Code> <Message>The specified key does not exist.</Message> <Details>No such object: my-bucket/media/uploads/01.JPG</Details> </Error>

我尝试在GCP控制台中直接上传文件,并可以访问文件。
当我使用

gsutil cp .gitignore gs://my-bucket/media/

可以参观file。
是我的
settings.py

# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.1/howto/static-files/ DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage' STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage' GS_BUCKET_NAME = 'my-bucket' GS_MEDIA_BUCKET_NAME = 'my-bucket' GS_DEFAULT_ACL = 'publicRead' GS_FILE_OVERWRITE = False STATIC_URL = f"https://storage.googleapis.com/{GS_BUCKET_NAME}/static/" MEDIA_URL = f"https://storage.googleapis.com/{GS_MEDIA_BUCKET_NAME}/media/"

和部署

apiVersion: apps/v1 kind: Deployment metadata: name: app spec: replicas: 2 selector: matchLabels: app: app template: metadata: labels: app: app spec: serviceAccountName: my-service-account containers: - name: app image: asia-east1-docker.pkg.dev/my-project-id/app/backend:latest ports: - containerPort: 8000 env: - name: DB_USER - name: DB_PASSWORD - name: DB_NAME - name: DB_HOST - name: DB_PORT resources: requests: memory: "512Mi" cpu: "500m" limits: memory: "1Gi" cpu: "1" - name: cloud-sql-proxy image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:latest args: volumeMounts: - name: cloudsql mountPath: /cloudsql securityContext: runAsNonRoot: true resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "250m" volumes: - name: cloudsql emptyDir: medium: Memory
我想要的是,当我通过API或Django管理员上传时,我可以在存储桶中找到文件。
    

您遇到的错误是由于应用程序的验证设置造成的。您不能仅使用访问令牌签名URL(您的应用程序使用默认方式)。因此,您可以:

Configure应用程序使用

IAM符号blobapi
python django google-cloud-storage google-kubernetes-engine
1个回答
0
投票
Conconfigure应用程序使用服务帐户的已安装的私钥。更多的动作可能不太安全。

请读取您附加的
    指导
  1. 仔细地从授权设置部分开始。您将在这里找到所有答案。
  2. 当去Django管理员时,就会有属性
Exception值:

您需要一个私钥来签名凭据。您当前使用的凭证仅包含一个令牌。有关更多详细信息 您的指南说: 如果您的应用程序处理已签名(到期)URL,则在以下部分中读取签名URL的选项。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.