簡體   English   中英

在 Gcloud 上部署時獲取 Flask 開發服務器的服務器錯誤,但由於許可,作為本地服務器工作正常

[英]Obtain server error for Flask development server when deployed on Gcloud but works fine as local server due to permission

錯誤:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 嘗試寫入只讀數據庫 2019-12-17 10:12:11 default[20191217t021035] [SQL: INSERT INTO post (title, date_posted, content, user_id) VALUES ?, ?, ?, ?)] 2019-12-17 10:12:11 default[20191217t021035] [參數:('hi', '2019-12-17 10:12:11.435775', 'hi', 3 ] 2019-12-17 10:12:11 default[20191217t021035](此錯誤的背景: http ://sqlalche.me/e/e3q8)

應用程序.yaml

runtime: python37
env: standard
handlers:
- url: /main.css
  static_dir: static/*
  expiration: "1h"
runtime_config:
  python_version: 3.7
  # This configures Google App Engine to serve the files in the app's static
  # directory.

#beta_settings:
#  cloud_sql_instances: flask-journal:us-west1:flask-project1

entrypoint: gunicorn -b :$PORT run:app 

配置文件

import os

class Config:
    SECRET_KEY = '[a correct key]'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'

    # E-Mail with Flask
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USER_SSL = True
    # Need to set environment variable
    MAIL_USERNAME = os.environ.get('EMAIL_USER') 
    MAIL_PASSWORD = os.environ.get('EMAIL_PW')
    MAIL_DEFAULT_SENDER = os.environ.get('EMAIL_USER') 

然后我還有一個 site.db 數據庫所在的位置。 使用后

gcloud app deploy

該網站托管,但我無法進行任何會更改數據庫的操作。 鑒於上面顯示的錯誤輸出,我幾乎可以肯定這是一個權限錯誤。 我看到了您可以在 Linux 上執行 chmod 的解決方案,但是您在 Windows 10 上做什么? 我猜現在不再允許(甚至登錄)更改數據庫的“用戶”在執行時寫入數據庫

db.commit()

Google Cloud 運行時的文件系統是只讀的 ( https://cloud.google.com/appengine/docs/standard/python3/runtime#filesystem ):

運行時包括一個完整的文件系統。 文件系統是只讀的,但位置/tmp除外,它是一個虛擬磁盤,用於在 App Engine 實例的 RAM 中存儲數據。

  • 因此,理論上您應該能夠將文件存儲在/tmp (注意 SQLAlchemy DB URI 中的四個斜杠表示絕對文件路徑):
SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/site.db'
  • 但這意味着 a) 每次實例停止時數據庫都會消失 b) 如果您將應用程序擴展到多個實例,則每個實例都將擁有自己的數據庫。
  • 我建議您在 Google 的 Cloud SQL 上查看 Postgresql,請參閱https://cloud.google.com/sql/docs/postgres/connect-app-engine了解如何從應用引擎連接到 Google Cloud 數據庫服務器。 然后配置將更改為:
SQLALCHEMY_DATABASE_URI = 'postgres://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM