8

我刚刚创建了一个 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
4

4 回答 4

17

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

chown www-data:www-data /home/username/Django    
chown www-data:www-data /home/username/Django/db.sqlite  
于 2015-05-16T06:15:32.773 回答
4

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

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

一个更好的主意是在生产中使用真实的数据库而不是 sqlite 来避免这种情况。

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

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

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 运行

于 2016-03-28T10:26:00.900 回答
1

我正在寻找解决方案,因为我通过此链接遵循 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
于 2017-08-27T22:39:48.397 回答
0

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

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

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

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

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

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

于 2017-09-14T15:21:15.540 回答