Flask应用在Debian+Apache2环境下无法打开SQLite数据库文件
问题解决思路
核心原因
Apache运行WSGI应用时,当前工作目录并不是你的flask_app文件夹,而是Apache的默认工作目录(比如/var/www/或/etc/apache2/)。你用相对路径'database.db'时,程序会去Apache的工作目录找文件,自然找不到,进而抛出无法打开数据库的错误。
解决方案
1. 使用数据库文件的绝对路径
修改get_db_connection方法,通过Flask应用的根目录拼接绝对路径,确保每次都能定位到正确的数据库文件:
import os from flask import current_app def get_db_connection(): # 拼接flask_app文件夹与数据库文件的绝对路径 db_path = os.path.join(current_app.root_path, 'database.db') conn = sqlite3.connect(db_path) conn.row_factory = sqlite3.Row return conn
如果你的__init__.py里是用app = Flask(__name__)初始化的应用,current_app.root_path会自动指向flask_app文件夹的绝对路径,无需手动硬编码路径。
2. 补全权限排查
即使路径正确,Apache运行的用户(通常是www-data)需要拥有flask_app文件夹和数据库文件的读写权限:
- 给文件夹设置所属用户与权限:
sudo chown -R www-data:www-data /path/to/your/flask_app sudo chmod -R 755 /path/to/your/flask_app - 单独给数据库文件开放读写权限:
sudo chmod 664 /path/to/your/flask_app/database.db
3. 修正WSGI配置
检查flaskapp.wsgi文件,确保它正确指向应用目录并设置工作路径:
import sys import os # 将flask_app的父目录加入Python路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 将工作目录切换到flask_app文件夹 os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'flask_app')) from flask_app import app as application
验证步骤
- 重启Apache服务:
sudo systemctl restart apache2 - 访问Flask应用,检查是否仍有数据库连接错误
- 若问题依旧,可以在
get_db_connection里添加打印语句输出db_path,然后查看Apache错误日志(/var/log/apache2/error.log),确认路径是否正确:print(db_path)
内容的提问来源于stack exchange,提问作者Lacey
相关产品推荐
相关产品推荐

