python - 部署在 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()
解决方案
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'
推荐阅读
- laravel - 扩展布局时出现未定义变量错误
- node.js - NODEJS 将 config.js 从父文件夹导入模块
- amazon-web-services - 调用 CreateBucket 操作时发生错误(IllegalLocationConstraintException)
- javascript - 创建静态图层时移相器框架上出现“无效的 Tilemap 图层 ID:墙”错误
- c++ - 将函数作为参数传递给另一个函数的不同方式之间有什么区别?
- python - Python 用正则表达式分割来分割字符串
- c - 读取 2 个 fgets 输入以使用 strncpy 作为名字和姓氏
- python - 文件到字典只打印一个
- javascript - 按内部数组对象中的键值对对象的外部数组进行排序
- r - 将 txt(对话)分成以演讲者姓名作为变量的列