我刚刚创建了一个Django项目
python manage.py startapp smartrecruitment
然后我运行了db sync
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
更改项目目录和数据库文件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来避免这种情况。
https://docs.djangoproject.com/en/1.9/ref/settings/#databases
如果你想坚持使用sqlite:将sqlite文件放在项目存储库之外并给它和包含目录正确的读/写访问(例如只有www-data可以写,但是你需要运行你的django命令作为www -数据)
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运行
我正在寻找解决方案,因为我通过此链接关注了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
简而言之,当写入sqlite数据库的应用程序没有写入权限时,就会发生这种情况。
这可以通过三种方式解决:
db.sqlite3
文件及其父目录(因此也可以写访问权限)的所有权(例如:chown username db.sqlite3
)sudo -i
或django gunicorn
之前运行命令runserver
)chmod 777 db.sqlite3
(危险选项)对所有用户进行读写访问注意:除非您在本地计算机上运行Web服务器,否则永远不要使用第三个选项,否则数据库中的数据对您来说并不重要。
第二种选择也很危险,因为@mateuszb说。 Django的代码注入风险非常低,因为Django是以这种方式设计的。在Django中,只有当开发人员使用eval
或exec
编写非常脆弱的代码时,才能捕获整个操作系统。如果您对代码质量没有信心,甚至不知道代码注入是什么,则第二个选项不适合您。
此外,如果您使用的是像mysql和Postgres这样的数据库,则不会发生此错误。对于流量较大的网络服务器来说,Sqlite不是一个好选择。