Flask部署至Render后所有路由出现弱引用KeyError求助
Flask部署Render平台后Session关联数据库KeyError问题解决
本地开发环境下Flask应用运行完全正常,包括Session功能,但部署到Render平台后,所有路由访问均触发如下错误:
[55] [ERROR] Error handling request /valle-de-guadalupe Traceback (most recent call last): File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/app.py", line 2525, in wsgi_app response = self.full_dispatch_request() File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/app.py", line 1822, in full_dispatch_request rv = self.handle_user_exception(e) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/app.py", line 1820, in full_dispatch_request rv = self.dispatch_request() File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/app.py", line 1796, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/opt/render/project/src/app_folder/routes/public.py", line 35, in valle_de_guadalupe return render_template("public/cities/valle_guadalupe.html") File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/templating.py", line 147, in render_template return _render(app, template, context) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/templating.py", line 128, in _render app.update_template_context(context) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask/app.py", line 994, in update_template_context context.update(func()) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask_login/utils.py", line 407, in _user_context_processor return dict(current_user=_get_user()) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask_login/utils.py", line 372, in _get_user current_app.login_manager._load_user() File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask_login/login_manager.py", line 364, in _load_user user = self._user_callback(user_id) File "/opt/render/project/src/app.py", line 52, in load_user return User.get_by_id(int(user_id)) File "/opt/render/project/src/app_folder/models/models.py", line 82, in get_by_id return User.query.get(id) File "<string>", line 2, in get File "/opt/render/project/src/.venv/lib/python3.7/site-packages/sqlalchemy/util/deprecations.py", line 402, in warned return fn(*args, **kwargs) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 947, in get return self._get_impl(ident, loading.load_on_pk_identity) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 959, in _get_impl execution_options=self._execution_options, File "/opt/render/project/src/.venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2959, in _get_impl load_options=load_options, File "/opt/render/project/src/.venv/lib/python3.7/site-packages/sqlalchemy/orm/loading.py", line 534, in load_on_pk_identity bind_arguments=bind_arguments, File "/opt/render/project/src/.venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1702, in execute bind = self.get_bind(**bind_arguments) File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask_sqlalchemy/session.py", line 61, in get_bind engines = self._db.engines File "/opt/render/project/src/.venv/lib/python3.7/site-packages/flask_sqlalchemy/extension.py", line 629, in engines return self._app_engines[app] File "/usr/local/lib/python3.7/weakref.py", line 396, in __getitem__ return self.data[ref(key)] KeyError: <weakref at 0x7fc9e8267ad0; to 'Flask' at 0x7fc9e9ec5750>
涉及代码文件
index.py
from app import app from app_folder.utils.db import db db.init_app(app) with app.app_context(): db.create_all() if __name__ == "__main__": app.run( debug = False, port = 5000 )
app.py
from flask import Flask """Flask SqlAlchemy""" from flask_sqlalchemy import SQLAlchemy """Flask Login""" from flask_login import LoginManager """Dot Env""" from dotenv import load_dotenv """App Folder Routes""" from app_folder.handlers.stripe_handlers import stripe_error from app_folder.handlers.web_handlers import web_error from app_folder.models.models import User from app_folder.routes.admin import admin from app_folder.routes.public import public from app_folder.routes.users import users from app_folder.utils.db import db """Imports""" import os import stripe load_dotenv() """config app""" app = Flask(__name__, static_url_path="", template_folder="app_folder/templates", static_folder="app_folder/static") app.config['SECRET_KEY'] = os.getenv("SECRET_KEY") app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv("SQLALCHEMY_DATABASE_VERSION")+os.getenv("SQLALCHEMY_USERNAME")+":"+os.getenv("SQLALCHEMY_PASSWORD")+"@"+os.getenv("SQLALCHEMY_SERVER")+"/"+os.getenv("SQLALCHEMY_DATABASE") app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = os.getenv("SQLALCHEMY_TRACK_MODIFICATIONS") """blueprints""" app.register_blueprint(stripe_error) app.register_blueprint(web_error) app.register_blueprint(admin) app.register_blueprint(public) app.register_blueprint(users) SQLAlchemy(app) login_manager = LoginManager(app) """ stripe """ stripe_keys = { 'secret_key': os.getenv("STRIPE_SECRET_KEY"), 'publishable_key': os.getenv("STRIPE_PUBLISHABLE_KEY") } stripe.api_key = stripe_keys['secret_key'] """Login Manager""" @login_manager.user_loader def load_user(user_id): return User.get_by_id(int(user_id)) """Teardown""" @app.teardown_appcontext def shutdown_session(exception=None): db.session.remove()
public.py
"""routes""" @public.route("/", methods=["GET", "POST"]) def index(): return redirect(url_for('public.valle_de_guadalupe')) """cities""" @public.route("/valle-de-guadalupe", methods=["GET", "POST"]) def valle_de_guadalupe(): return render_template("public/cities/valle_guadalupe.html")
问题原因
错误栈中的KeyError来自Flask-SQLAlchemy的弱引用字典_app_engines,说明当前SQLAlchemy实例与Flask应用实例的关联失效。核心问题:
- app.py中同时导入了全局
db实例,又重新创建了新的SQLAlchemy(app)实例,导致两个db实例冲突,全局db未正确关联到Flask应用 - 全局
db在index.py中通过db.init_app(app)初始化,但app.py未同步关联,请求处理时找不到对应数据库引擎
解决步骤
统一SQLAlchemy实例
修改app.py,删除SQLAlchemy(app)一行,替换为db.init_app(app),确保使用全局唯一的db实例关联Flask应用:# 替换原有的SQLAlchemy(app) db.init_app(app)确认全局db实例定义
检查app_folder/utils/db.py,确保只创建一个SQLAlchemy实例:from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()调整初始化顺序
在app.py中,将db.init_app(app)放在应用配置完成之后、蓝图注册前后均可,确保配置已加载完成。验证Render环境变量
确认Render平台上的环境变量(如SECRET_KEY、数据库连接参数)已正确设置,避免配置缺失导致隐性问题。重新部署测试
将修改后的代码重新部署到Render,访问路由验证错误是否消失。
内容的提问来源于stack exchange,提问作者Jose Joel Vargas Martinez
相关产品推荐
相关产品推荐

