【问题标题】:Django: Attempt to write a read-only databaseDjango:尝试编写只读数据库
【发布时间】:2014-12-07 18:05:55
【问题描述】:

我刚刚用

创建了一个 Django 项目
python manage.py startapp smartrecruitment

然后我运行了一个数据库同步

 python manage.py syncdb
 Operations to perform:
 Apply all migrations: admin, contenttypes, auth, sessions
 Running migrations:
   Applying contenttypes.0001_initial... OK
   Applying auth.0001_initial... OK
   Applying admin.0001_initial... OK
   Applying sessions.0001_initial... OK

并添加了我的超级用户,但我无法在浏览器中访问 /admin。我尝试执行以下命令来授予 apache 权限,但没有运气。

sudo chown apache <folder_containing_db.sqlite3>
sudo chown apache db.sqlite3

【问题讨论】:

  • 为什么在开发项目时使用 Apache 运行项目?使用开发服务器,更简单。
  • 不是,但是我在使用 Django 1.7 时遇到了问题,所以想简单地在我的服务器上部署一个基本项目。
  • @Jon 是什么让你说数据库是“只读的”? “我无法在浏览器中访问 /admin”是模糊的。无法访问怎么办?在浏览器中出现错误?在 Apache 日志中出现错误?其他错误?
  • 我在访问该 URL 时收到错误“尝试写入只读数据库”。它应该为管理部分提供一个登录表单,但我得到的只是一个显示该消息的错误页面。和这个问题很相似...stackoverflow.com/questions/21054245/…
  • the quesiton you've linked有什么不同?

标签: python django apache django-1.7


【解决方案1】:

更改项目目录和数据库文件的所有者www-data

chown www-data:www-data /home/username/Django    
chown www-data:www-data /home/username/Django/db.sqlite  

【讨论】:

  • 我不知道为什么有人反对它。这个答案实际上帮助了我!
  • 这不是一个好的做法。你的www-data 用户对你的数据库有写权限(并且需要)所以它可以工作,但是你也给了它对整个代码库的写权限,它绝对不应该这样做
【解决方案2】:

您确实存在用户/组权限问题:您需要使用对您的 db 文件具有读/写权限的用户运行您的网络服务器(使用 sqlite3 时)

更改整个项目的所有者和组是一个坏主意,因为它会让您的网络服务器用户在您的代码库上编写代码,这绝不是一个好的做法

更好的办法是在生产环境中使用真实数据库而不是 sqlite 来避免这种情况。

https://docs.djangoproject.com/en/1.9/ref/settings/#databases

如果您想坚持使用 sqlite:将您的 sqlite 文件放在项目存储库之外,并为它和包含目录提供正确的读/写访问权限(例如,只有 www-data 可以写入,但是您需要运行您的 django命令作为 www-data)

some_dir [your_user:your_group]
--- your_django_project [github_user:github_user]
--- another_dir [www-data:www-data]
    |--- db.sqlite3 [www-data:www-data]

您的网络服务器(apache / nginx)作为 www-data 运行

【讨论】:

  • 你能在这里添加一些示例代码吗?这更像是一个理论上的答案,并不能完全解决问题。它已经听起来不错,但如果你也添加一些代码,它会是完美的!谢谢!
  • 我已经编辑了我的回复,没有涉及任何代码,因为它只是权限
【解决方案3】:

我正在寻找解决方案,因为我通过此链接遵循 CentOS 教程。 https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-centos-7

这是该教程的许可,

sudo usermod -a -G root apache
chmod 710 /root/myproject
chown apache:apache /root/myproject
chown apache:apache /root/myproject/db.sqlite

【讨论】:

    【解决方案4】:

    简而言之,就是写入sqlite数据库的应用程序没有写入权限。

    这可以通过三种方式解决:

    1. 使用 chown 向用户授予 db.sqlite3 文件及其父目录的所有权(因此也可以写入)(例如:chown username db.sqlite3
    2. 以 root 用户身份运行网络服务器(通常是 gunicorn)(在运行 gunicorn 或 django runserver 之前运行命令 sudo -i
    3. 通过运行命令chmod 777 db.sqlite3(危险选项)允许对所有用户进行读写访问

    注意: 除非您在本地机器上运行网络服务器,或者数据库中的数据对您来说根本不重要,否则永远不要选择第三个选项。

    正如@mateuszb 所说,第二个选项也很危险。 Django 中代码注入的风险非常低,因为 Django 就是这样设计的。在 Django 中,只有当开发人员使用evalexec 编写极易受攻击的代码时,才能捕获整个操作系统。如果您对自己的代码质量没有信心,甚至不知道代码注入是什么,那么第二个选项不适合您。

    此外,如果您使用的是 mysql 和 Postgres 等数据库,则不会出现此错误。对于高流量的网络服务器来说,Sqlite 不是一个好的选择。

    【讨论】:

    • 也不要做 2。您的代码中的任何漏洞都会为黑客提供 sudo 权限。
    • @mateuszb 我同意。能举个典型的例子吗?
    • 我不确定典型的会是什么,但任何代码注入都可能导致整个操作系统被捕获,从而使内部网络处于危险之中。如果该网站属于 apache(如 apache httpd 的情况),则黑客仅限于其拥有并可以写入的文件 - 这甚至应该排除其自己的代码。此类用户也应该可以使用有限的工具(无 ssh 等)。
    • @mateuszb 在 Django 中代码注入的风险非常低,因为 django 就是这样设计的。在 Django 中,只有当开发人员使用 evalexec 编写易受攻击的代码时,才能捕获整个操作系统。
    猜你喜欢
    • 2023-03-09
    • 2021-11-07
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2014-01-30
    • 2016-08-16
    相关资源
    最近更新 更多