首页 > 解决方案 > 部署在 Gcloud 上时获取 Flask 开发服务器的服务器错误,但由于许可,可以作为本地服务器正常工作

问题描述

错误:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 尝试写入只读数据库 2019-12-17 10:12:11 默认 [20191217t021035] [SQL: INSERT INTO post (title, date_posted, content, user_id) VALUES ( ?, ?, ?, ?)] 2019-12-17 10:12:11 默认[20191217t021035] [参数:('hi', '2019-12-17 10:12:11.435775', 'hi', 3) ] 2019-12-17 10:12:11 默认[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()

标签: pythonflasksqlalchemygcloud

解决方案


Google Cloud 运行时的文件系统是只读的 ( https://cloud.google.com/appengine/docs/standard/python3/runtime#filesystem ):

运行时包括一个完整的文件系统。文件系统是只读的,除了 location /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'

推荐阅读