Python Django:尝试写入只读数据库

Python Django:尝试写入只读数据库,python,django,apache,django-1.7,Python,Django,Apache,Django 1.7,我刚刚用创建了一个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

我刚刚用创建了一个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
sudo chown apache sudo chown apache db.sqlite3
更改项目目录和数据库文件的所有者
www-data

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

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

更改整个项目的所有者和组是一个坏主意,因为这样会允许web服务器用户在您的代码库上编写代码,这从来都不是一个好做法

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

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


您的Web服务器(apache/nginx)以www-data运行

我一直在寻找解决方案,因为我遵循CentOS教程中的这个链接。
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]

这是该教程的权限

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

简而言之,当写入sqlite数据库的应用程序没有写入权限时,就会发生这种情况

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

  • 使用chown(例如:
    chown username db.sqlite3
    )将
    db.sqlite3
    文件及其父目录的所有权授予用户
  • 以root用户身份运行Web服务器(通常是gunicorn)(在运行
    gunicorn
    或django
    runserver
    之前运行命令
    sudo-i
  • 通过运行命令
    chmod 777 db.sqlite3
    (危险选项)
    允许所有用户进行读写访问
  • 注意: 除非您在本地计算机上运行Web服务器,或者数据库中的数据对您来说根本不重要,否则不要选择第三个选项

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


    此外,如果您使用的是mysql和Postgres之类的数据库,则不会发生此错误。Sqlite对于流量大的Web服务器不是一个好的选择。

    在开发项目时,为什么要用Apache运行项目?使用dev服务器更简单。事实并非如此,但我在使用Django 1.7时遇到了问题,所以只想在我的服务器上部署一个基本项目。@Jon你为什么说数据库是“只读的”?“我无法在浏览器中访问/管理”是含糊不清的。无法访问如何?在浏览器中获取错误?在Apache日志中获取错误?还有其他错误吗?当我转到该URL时,会出现“尝试写入只读数据库”错误。它应该为管理部分提供一个登录表单,但我得到的只是一个显示该消息的错误页面。这与这个问题非常相似。。。它和我有什么不同?我不知道为什么有人否决了它。这个答案实际上帮助了我!这不是一个好的做法。您的
    www-data
    用户对您的数据库具有写入权限(并且需要),因此它可以正常工作,但您也为它授予了对整个代码库的写入权限,它肯定无法记录。请在此处添加一些示例代码?这更多的是一个理论上的答案,并不能完全解决这个问题。它听起来已经不错了,但是如果你也添加一些代码,它将是完美的!谢谢我编辑了我的回复,没有涉及任何代码,因为它只是完美的。再次感谢!也不要做两件事。你代码中的任何漏洞都会赋予黑客sudo权限。@mateuszb我同意。你能给出一个典型的例子吗?我不确定典型的例子是什么,但任何代码注入都可能导致整个操作系统被捕获,使内部网络处于危险之中。如果该网站属于apache(如apache httpd),则黑客仅限于其拥有并可以写入的文件,甚至应排除其自己的代码。这样的用户也可以使用有限的工具(没有ssh等)。@mateuszb在Django中代码注入的风险非常低,因为Django就是这样设计的。在Django中,只有当开发人员使用
    eval
    exec
    编写极易受攻击的代码时,才能捕获整个操作系统