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

解决Django部署Apache时OperationalError:尝试写入只读数据库

解决Django+Apache下SQLite "attempt to write a readonly database" 错误

以下是针对你问题的有效解决步骤:

1. 确保数据库所在目录的权限与属主正确

SQLite不仅需要db.sqlite3文件的写入权限,还需要其所在目录的写入权限(因为SQLite会在目录内创建临时日志文件):

  • 递归修改数据库所在目录的属主为Apache运行用户:
    sudo chown -R apache:apache /myproject/myapp/
    
  • 设置目录与文件的合理权限:
    sudo chmod -R 755 /myproject/myapp/
    
    (注:755权限确保Apache用户能进入目录并读取/写入文件,其他用户仅有读取权限)

2. 确认Apache实际运行用户

部分Linux发行版(如Debian/Ubuntu)中,Apache的运行用户是www-data而非apache,你可以通过以下命令确认:

ps aux | grep apache

如果输出显示用户是www-data,则将上述命令中的apache:apache替换为www-data:www-data。

3. 检查SELinux限制(CentOS/RHEL系服务器适用)

DigitalOcean的CentOS默认启用SELinux,即使文件权限正确,SELinux也可能阻止Apache写入目录:

  • 临时关闭SELinux测试:
    sudo setenforce 0
    
    测试登录功能,如果恢复正常,说明是SELinux的问题。
  • 永久添加SELinux上下文规则:
    sudo semanage fcontext -a -t httpd_sys_rw_content_t "/myproject/myapp(/.*)?"
    sudo restorecon -Rv /myproject/myapp/
    
    这会允许Apache读写该目录下的所有文件。

4. 验证权限设置

执行以下命令确认权限是否正确配置:

# 查看数据库文件权限
ls -l /myproject/myapp/db.sqlite3
# 查看数据库所在目录权限
ls -ld /myproject/myapp/

确保输出中db.sqlite3和目录的属主为Apache运行用户,且用户组有写入权限。

内容的提问来源于stack exchange,提问作者Tornike k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:23:15