Python Django:尝试写入只读数据库
我刚刚用创建了一个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
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 username db.sqlite3
)将db.sqlite3
文件及其父目录的所有权授予用户gunicorn
或djangorunserver
之前运行命令sudo-i
)chmod 777 db.sqlite3
(危险选项)允许所有用户进行读写访问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
编写极易受攻击的代码时,才能捕获整个操作系统