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

Flask服务器运行报错:无法创建LocalProxy对象弱引用,本地正常

Flask服务器运行报错:无法创建LocalProxy对象的弱引用

问题描述

本地localhost运行Flask的app.py正常,但部署到服务器后报错,尝试修改数据库IP未解决。

报错信息

Traceback (most recent call last):
  File "app.py", line 27, in <module>
    import auth
  File "/tmp/pycharm_project_flaskr/auth.py", line 5, in <module>
    from db import get_db, User
  File "/tmp/pycharm_project_flaskr/db.py", line 22, in <module>
    db.init_app(app)
  File "/usr/local/lib/python3.7/site-packages/flask_sqlalchemy/extension.py", line 305, in init_app
    engines = self._app_engines.setdefault(app, {})
  File "/usr/local/lib/python3.7/weakref.py", line 489, in setdefault
    return self.data.setdefault(ref(key, self._remove),default)
TypeError: cannot create weak reference to 'LocalProxy' object

数据库配置代码

app = current_app
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy()
db.init_app(app)

解决方法

错误原因

报错核心是current_app是Flask的LocalProxy代理对象,而SQLAlchemy的init_app()方法需要接收实际的Flask应用实例——因为内部要对app创建弱引用,但LocalProxy不支持被创建弱引用,所以触发报错。本地运行可能因上下文初始化顺序问题暂时掩盖了这个问题,服务器环境下则暴露出来。

修改方案

调整数据库初始化逻辑,避免直接用current_app,改用实际的Flask应用实例传入:

  1. 修改db.py代码:
from flask_sqlalchemy import SQLAlchemy

# 先初始化db实例
db = SQLAlchemy()

def init_db(app, username, password, hostname, port, database):
    # 传入实际的app实例,配置数据库连接
    db_uri = f'mysql+pymysql://{username}:{password}@{hostname}:{port}/{database}?charset=utf8'
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    db.init_app(app)
  1. 在主文件app.py中初始化数据库:
from flask import Flask
from db import init_db, db

# 创建实际的Flask应用实例
app = Flask(__name__)

# 替换为你的数据库参数
DB_USER = 'your_username'
DB_PWD = 'your_password'
DB_HOST = 'your_db_host'
DB_PORT = 3306
DB_NAME = 'your_db_name'

# 初始化数据库,传入实际的app实例
init_db(app, DB_USER, DB_PWD, DB_HOST, DB_PORT, DB_NAME)

# 确保在数据库初始化后再导入其他依赖db的模块
import auth

# 后续的路由等逻辑...

这样调整后,db.init_app()接收的是真实的Flask应用对象,就能正常创建弱引用,解决报错问题。

内容的提问来源于stack exchange,提问作者Coconut water

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:55:21