You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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未同步关联,请求处理时找不到对应数据库引擎

解决步骤

  1. 统一SQLAlchemy实例
    修改app.py,删除SQLAlchemy(app)一行,替换为db.init_app(app),确保使用全局唯一的db实例关联Flask应用:

    # 替换原有的SQLAlchemy(app)
    db.init_app(app)
    
  2. 确认全局db实例定义
    检查app_folder/utils/db.py,确保只创建一个SQLAlchemy实例:

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    
  3. 调整初始化顺序
    在app.py中,将db.init_app(app)放在应用配置完成之后、蓝图注册前后均可,确保配置已加载完成。

  4. 验证Render环境变量
    确认Render平台上的环境变量(如SECRET_KEY、数据库连接参数)已正确设置,避免配置缺失导致隐性问题。

  5. 重新部署测试
    将修改后的代码重新部署到Render,访问路由验证错误是否消失。

内容的提问来源于stack exchange,提问作者Jose Joel Vargas Martinez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:35:33