Flask heroku 应用程序不允许我分配一些配置设置

Flask heroku app won't let me assign some config settings

我有一个 flask MySql 应用程序可以在本地正常工作,但是当我部署到 heroku 时它给我以下错误:

2022-02-12T05:28:26.114583+00:00 app[web.1]: File "/app/app.py", line 38, in <module>
2022-02-12T05:28:26.114583+00:00 app[web.1]: app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
2022-02-12T05:28:26.114584+00:00 app[web.1]: TypeError: 'str' object does not support item assignment

当我使用 app.debug = False 时它做了同样的事情。我试图通过删除它来修复它,但现在它给了我上述错误。

我尝试对每一行给出错误进行评论,看起来下面的所有行都给出了相同的错误:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SESSION_PERMANENT'] = False
app.config['SESSION_TYPE'] = "filesystem"

这些行之前的几行我有 app.config['MAIL_USE_SSL'] = True 和一些其他邮件配置设置(端口、服务器、用户名、密码)其中 none 给出了错误,所以我不明白是什么问题是。当我 google 错误时,它与字符串的不可变性有关,所以我不明白我的问题是什么。

当我评论以上所有内容时,它会给我:

2022-02-12T08:11:34.109191+00:00 app[web.1]: Session(app)
2022-02-12T08:11:34.109196+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.8/site-packages/flask_session/__init__.py", line 54, in __init__
2022-02-12T08:11:34.109196+00:00 app[web.1]: self.init_app(app)
2022-02-12T08:11:34.109196+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.8/site-packages/flask_session/__init__.py", line 61, in init_app
2022-02-12T08:11:34.109197+00:00 app[web.1]: app.session_interface = self._get_interface(app)
2022-02-12T08:11:34.109197+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.8/site-packages/flask_session/__init__.py", line 64, in _get_interface
2022-02-12T08:11:34.109197+00:00 app[web.1]: config = app.config.copy()
2022-02-12T08:11:34.109198+00:00 app[web.1]: AttributeError: 'str' object has no attribute 'copy'

如果与此问题相关,我正在 heroku 上使用 JawsDB MySQL 插件。

代码如下:

from flask import Flask
from flask_mail import Mail
from os import environ
from flask_session import Session
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['MAIL_SERVER'] = 'smtp.domain.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = "mail@domain.com"
app.config['MAIL_PASSWORD'] = environ.get("MAIL_PASSWORD")
mail = Mail(app)

MY_APP_ENV = environ.get("MY_APP_ENV")
if MY_APP_ENV == 'prod':
    app.debug = False
    app.config = environ.get("JAWSDB_URL")
else:
    app.debug = True
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/my_app'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SESSION_PERMANENT'] = False
app.config['SESSION_TYPE'] = "filesystem"
Session(app)
CORS(app)

db = SQLAlchemy(app)
# rest is the routings etc.

这是问题所在:

app.config = environ.get("JAWSDB_URL")

您正在用环境中的单个值覆盖 app.config

你的意思是这样的吗?

app.config["SQLALCHEMY_DATABASE_URI"] = environ.get("JAWSDB_URL")