Django:尝试编写只读数据库

问题描述 投票:4回答:4

我刚刚创建了一个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
python django apache django-1.7
4个回答
11
投票

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

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

3
投票

您确实存在用户/组权限问题:您需要使用对您的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运行


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

-1
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.