Django:尝试编写只读数据库

时间:2014-10-13 08:15:25

标签: python django apache django-1.7

我刚刚用

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

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:3)

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

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

更好的想法是在生产中使用真实数据库而不是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

运行

答案 2 :(得分: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

答案 3 :(得分:-1)

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

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

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

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

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

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